/ Hex Artifact Content
Login

Artifact ae82cf32c497d9a3a0f147de1b7219b636db4f53:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
3770: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3780: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3790: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
37a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
37b0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
37c0: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
37d0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
37e0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
37f0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3800: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3810: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3820: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3830: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3840: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3850: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3860: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3870: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3880: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3890: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
38a0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
38b0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
38c0: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
38d0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
38e0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
38f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3910: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3920: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3930: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3940: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3950: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3960: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3970: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3980: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3990: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
39a0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
39b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
39c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
39d0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
39e0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
39f0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3a00: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3a10: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3a20: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3a30: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3a60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3a70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3a80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3aa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3ab0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
3ac0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3ad0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
3ae0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3af0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3b00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
3b10: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
3b20: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
3b30: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
3b40: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
3b50: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
3b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
3b70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3b80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3b90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
3ba0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
3bb0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
3bc0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
3bd0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
3be0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
3c00: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3c10: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
3c20: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
3c30: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
3c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3c50: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
3c60: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
3c70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3c80: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
3c90: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3ca0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
3cb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3ce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3cf0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
3d00: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
3d10: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
3d20: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
3d30: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
3d40: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
3d50: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
3d60: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
3d70: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
3d80: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
3d90: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
3da0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
3db0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
3dc0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3dd0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
3de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
3df0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
3e00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
3e10: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
3e20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3e30: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3e40: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3e50: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3e60: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
3e70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
3e80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
3e90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3ea0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
3eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
3ef0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
3f00: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
3f10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3f20: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3f30: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3f40: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
3f50: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
3f60: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
3f70: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
3f80: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
3f90: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
3fa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3fb0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
3fc0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
3fd0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
3fe0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
3ff0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
4000: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
4010: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4030: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4040: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4050: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4060: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4070: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4090: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
40a0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
40b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
40c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
40d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
40f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4100: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f  }../*.** Retry o
4110: 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74  pen() calls that
4120: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4130: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4140: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4160: 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74  f, int m){.  int
4170: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
4180: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d  osOpen(z,f,m); }
4190: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
41a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
41b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
41c0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
41d0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
41e0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
41f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
4200: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
4210: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
4220: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
4230: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
4240: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4250: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
4260: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
4270: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
4280: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
4290: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
42a0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
42b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
42c0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
42d0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
42e0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
42f0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
4300: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4310: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
4320: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
4330: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
4340: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
4350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
4360: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
4370: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
4380: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
4390: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
43a0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
43b0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
43c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
43d0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
43e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
43f0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
4400: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4410: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
4420: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4430: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
4440: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4450: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4460: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
4470: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4480: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
4490: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
44a0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
44b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
44c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
44d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
44e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
44f0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
4500: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4510: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
4520: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
4530: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
4540: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
4550: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
4560: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
4570: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
4580: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
4590: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
45a0: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
45b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
45c0: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
45d0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
45e0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
45f0: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
4600: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
4610: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
4620: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
4630: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
4640: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
4650: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
4660: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
4670: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
4680: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
4690: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
46a0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
46b0: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
46c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
46d0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
46e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
46f0: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
4700: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
4710: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
4720: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4730: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
4740: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
4750: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
4760: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
4770: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
4780: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
4790: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
47a0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
47b0: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
47c0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
47d0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
47e0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
47f0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
4800: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
4810: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
4820: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
4830: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
4840: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
4850: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
4860: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
4870: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
4880: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
4890: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
48a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
48b0: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
48c0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
48d0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
48e0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
48f0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
4900: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4910: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
4920: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
4930: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
4940: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4950: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4960: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4970: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4980: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4990: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
49a0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
49b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
49c0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
49d0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
49e0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
49f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
4a00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4a10: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
4a20: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
4a30: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
4a40: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
4a50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
4a60: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4a70: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
4a80: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
4a90: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
4aa0: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
4ab0: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
4ac0: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
4ad0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
4ae0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
4af0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
4b00: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
4b10: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
4b20: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
4b30: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
4b40: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
4b50: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
4b60: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
4b70: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
4b80: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4b90: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
4ba0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4bb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4bc0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
4bd0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4be0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
4bf0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
4c00: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
4c10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
4c20: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4c30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4c40: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4c50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4c60: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
4c70: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
4c80: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
4c90: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
4ca0: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
4cb0: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
4cc0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
4cd0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
4ce0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
4cf0: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
4d00: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
4d10: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
4d20: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
4d30: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
4d40: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
4d50: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4d60: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4d80: 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68  _ftruncate(int h
4d90: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
4da0: 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sz){.  int rc;. 
4db0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75   do{ rc = osFtru
4dc0: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
4dd0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
4de0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
4df0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e10: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
4e20: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
4e30: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
4e40: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
4e50: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
4e60: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
4e70: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
4e80: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
4e90: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
4ea0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
4eb0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
4ec0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
4ed0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
4ee0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
4ef0: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
4f00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
4f10: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
4f20: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
4f30: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
4f40: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
4f50: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
4f60: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
4f70: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
4f80: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
4f90: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
4fa0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
4fb0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
4fc0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
4fd0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
4fe0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
4ff0: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
5000: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
5010: 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20  sixError) {.#if 
5020: 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  0.  /* At one po
5030: 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61  int this code wa
5040: 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20  s not commented 
5050: 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20  out. In theory, 
5060: 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
5070: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
5080: 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75   hit, as this fu
5090: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
50a0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
50b0: 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e  er.  ** a lockin
50c0: 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  g-related functi
50d0: 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29  on (i.e. fcntl()
50e0: 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e  ) has returned n
50f0: 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a  on-zero with.  *
5100: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  * the value of e
5110: 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73  rrno as the firs
5120: 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63  t argument. Sinc
5130: 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e a system call 
5140: 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a  has failed,.  **
5150: 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65   errno should be
5160: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a   non-zero..  **.
5170: 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69    ** Despite thi
5180: 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c  s, if errno real
5190: 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73  ly is zero, we s
51a0: 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20  till don't want 
51b0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
51c0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79  QLITE_OK. The sy
51d0: 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64  stem call failed
51e0: 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c  , and *some* SQL
51f0: 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64  ite error should
5200: 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61   be.  ** propaga
5210: 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ted back to the 
5220: 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69  caller. Commenti
5230: 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f  ng this branch o
5240: 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d  ut means errno==
5250: 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68  0.  ** will be h
5260: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64  andled by the "d
5270: 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65  efault:" case be
5280: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  low..  */.  case
5290: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
52a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
52b0: 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e  f..  case EAGAIN
52c0: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
52d0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
52e0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
52f0: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
5300: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
5310: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
5320: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
5330: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5340: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
5350: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5360: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
5370: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
5380: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5390: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
53a0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
53b0: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
53c0: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
53d0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
53e0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
53f0: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
5400: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
5410: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5420: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
5430: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5440: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
5450: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  NLOCK) || ..(sql
5460: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
5470: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
5480: 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72   ||..(sqliteIOEr
5490: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
54a0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
54b0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
54c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
54d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
54e0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
54f0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
5500: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
5510: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
5520: 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20    /* EDEADLK is 
5530: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
5540: 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c   a call to fcntl
5550: 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61  (F_SETLKW) is ma
5560: 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69  de. And.  ** thi
5570: 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d  s module never m
5580: 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c  akes such a call
5590: 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69  . And the code i
55a0: 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20  n SQLite itself 
55b0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68  .  ** asserts th
55c0: 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  at SQLITE_IOERR_
55d0: 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72  BLOCKED is never
55e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74   returned. For t
55f0: 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a  hese reasons.  *
5600: 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20 61  * this case is a
5610: 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
5620: 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  t. If the system
5630: 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20   does set errno 
5640: 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a  to EDEADLK,.  **
5650: 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c   the default SQL
5660: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f  ITE_IOERR_XXX co
5670: 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  de will be retur
5680: 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ned. */.#if 0.  
5690: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
56a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56b0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23  IOERR_BLOCKED;.#
56c0: 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45  endif.    .#if E
56d0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
56e0: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
56f0: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
5700: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
5710: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
5720: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5730: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
5740: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
5750: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
5760: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5770: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5780: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
5790: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
57a0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
57b0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
57c0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
57d0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
57e0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
57f0: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
5800: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
5810: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
5820: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
5830: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
5840: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
5850: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
5860: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
5870: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
5880: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
5890: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
58c0: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
58d0: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
58e0: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
58f0: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
5900: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
5910: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
5920: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
5930: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
5940: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
5950: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
5960: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
5970: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
59e0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
59f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
5a00: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5a20: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
5a30: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
5a40: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
5a50: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
5a60: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
5a70: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
5a80: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
5a90: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
5aa0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
5ab0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
5ac0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
5ad0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
5ae0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
5af0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
5b00: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
5b10: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
5b20: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5b30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5b40: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
5b50: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
5b60: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
5b70: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
5b80: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5b90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
5ba0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
5bb0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
5bc0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
5bd0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
5be0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
5bf0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
5c00: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
5c10: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
5c20: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
5c30: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
5c40: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
5c50: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
5c60: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
5c70: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
5c80: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
5c90: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
5ca0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
5cb0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
5cc0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
5cd0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
5ce0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
5cf0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
5d00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5d10: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
5d20: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
5d30: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
5d40: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
5d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d60: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
5d70: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
5d80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5db0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
5dc0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
5dd0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
5de0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
5df0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
5e00: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
5e10: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
5e20: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
5e30: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
5e40: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
5e50: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
5e60: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
5e70: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
5e80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
5e90: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
5ea0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
5eb0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
5ec0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
5ed0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
5ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
5ef0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
5f00: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
5f10: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
5f20: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
5f30: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
5f40: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
5f50: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
5f60: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
5f70: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
5f80: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
5f90: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
5fa0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
5fb0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
5fc0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
5fd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
5fe0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
5ff0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6000: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
6010: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
6020: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
6030: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
6040: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
6050: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
6060: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
6070: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
6080: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
6090: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
60a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
60b0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
60c0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
60d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
60e0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
60f0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
6100: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
6110: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
6120: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6140: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
6150: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
6160: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
6170: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
6180: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
6190: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
61a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
61b0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
61c0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
61d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
61e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6200: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
6210: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
6220: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
6230: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
6240: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
6250: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
6260: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6270: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
6280: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
6290: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
62a0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
62b0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
62c0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
62d0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
62e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
62f0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
6300: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
6310: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
6320: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6330: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
6340: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
6350: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
6360: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
6370: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
6380: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6390: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
63a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
63b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
63c0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
63d0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
63e0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
63f0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
6400: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
6410: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
6420: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
6430: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
6440: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6450: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
6460: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
6470: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
6480: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
6490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
64b0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
64c0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
64d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
64e0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
64f0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
6500: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
6510: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
6520: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6530: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
6540: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
6550: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
6560: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
6570: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
6580: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
6590: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
65a0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
65b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
65c0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
65d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
65e0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
65f0: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
6600: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
6610: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
6620: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
6630: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
6640: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
6650: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6660: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
6670: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6680: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
6690: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
66a0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
66b0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
66c0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
66d0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
66e0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
66f0: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
6700: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
6710: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
6720: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
6730: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
6740: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
6750: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6760: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
6770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6780: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
6790: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
67a0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
67b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
67c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
67d0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
67e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
67f0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
6800: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
6810: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
6820: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
6830: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
6840: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
6850: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
6860: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
6870: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
6880: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
6890: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
68a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
68b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
68c0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
68d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
68e0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
68f0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
6900: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
6910: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
6920: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
6930: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
6940: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6950: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
6960: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
6970: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
6980: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
6990: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
69a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
69b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
69c0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
69d0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
69e0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
69f0: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
6a00: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
6a10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
6a20: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
6a30: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
6a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6a50: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
6a60: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
6a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
6a80: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
6aa0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6ab0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6ac0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6ad0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
6ba0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
6bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6bd0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
6be0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
6bf0: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
6c00: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
6c10: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
6c20: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
6c30: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
6c40: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
6c50: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
6c60: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
6c70: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
6c80: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
6c90: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
6ca0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
6cb0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
6cc0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
6cd0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
6ce0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
6cf0: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
6d00: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
6d10: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
6d20: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
6d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6d40: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
6d50: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
6d60: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
6d70: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
6d80: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
6d90: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
6da0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
6db0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
6dc0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
6dd0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
6de0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
6df0: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
6e00: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
6e10: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
6e20: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
6e30: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
6e40: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
6e50: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
6e60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
6e70: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
6e80: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
6e90: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
6ea0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
6eb0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
6ec0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
6ed0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
6ee0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
6ef0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
6f00: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
6f10: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
6f20: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
6f30: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
6f40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
6f50: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
6f60: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
6f70: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
6f80: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
6f90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
6fa0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
6fb0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
6fc0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
6fd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
6fe0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
6ff0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
7000: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
7010: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
7020: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
7030: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
7040: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
7050: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
7060: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
7070: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
7080: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
7090: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
70a0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
70b0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
70c0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
70d0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
70e0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
70f0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
7100: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
7110: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
7120: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
7130: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
7140: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
7150: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
7160: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
7170: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7180: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
7190: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
71a0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
71b0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
71c0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
71d0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
71e0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
71f0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
7200: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
7210: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
7220: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
7230: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
7240: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
7250: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
7260: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
7270: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
7280: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
7290: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
72a0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
72b0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
72c0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
72d0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
72e0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
72f0: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
7300: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
7310: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
7320: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
7330: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
7340: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
7350: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
7360: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
7370: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
7380: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
7390: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
73a0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
73b0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
73c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
73d0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
73e0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
73f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
7400: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
7410: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
7420: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
7430: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
7440: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
7450: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
7460: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
7470: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
7480: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
7490: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
74a0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
74b0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
74c0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
74d0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
74e0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
74f0: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
7500: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
7510: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
7520: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
7530: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
7540: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
7550: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
7560: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
7570: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
7580: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
7590: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
75a0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
75b0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
75c0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
75d0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
75e0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
75f0: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
7600: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
7610: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7620: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
7630: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
7640: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
7650: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
7660: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
7670: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
7680: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
7690: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
76a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
76b0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
76c0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
76d0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
76e0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
76f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
7700: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
7710: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
7720: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
7730: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
7740: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
7750: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
7760: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
7770: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
7780: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
7790: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
77a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
77b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
77c0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
77d0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
77e0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
77f0: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
7800: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
7810: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
7820: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
7830: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
7840: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
7850: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
7860: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
7870: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7880: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
7890: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
78a0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
78b0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
78c0: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
78d0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
78e0: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
78f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
7900: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
7910: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
7920: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
7930: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
7940: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
7950: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
7960: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
7970: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
7980: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
7990: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
79a0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
79b0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
79c0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
79d0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
79e0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
79f0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
7a00: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
7a10: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
7a20: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
7a30: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
7a40: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
7a50: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
7a60: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
7a70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
7a80: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
7a90: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
7aa0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
7ab0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
7ac0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
7ad0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
7ae0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
7af0: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
7b00: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
7b10: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
7b20: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
7b30: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
7b40: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
7b50: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
7b60: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
7b70: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
7b80: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
7b90: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
7ba0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
7bb0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
7bc0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
7bd0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
7be0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
7bf0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
7c00: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
7c10: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
7c20: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
7c30: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
7c40: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
7c50: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
7c60: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
7c70: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7c80: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
7c90: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7ca0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
7cb0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
7cc0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
7cd0: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
7ce0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
7cf0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
7d00: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
7d10: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
7d20: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
7d30: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
7d40: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
7d50: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
7d60: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
7d70: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
7d80: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
7d90: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
7da0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
7db0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
7dc0: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
7dd0: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
7de0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7df0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
7e00: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7e10: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
7e20: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
7e30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7e40: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
7e50: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
7e60: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
7e70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7e80: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7e90: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
7ea0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
7eb0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
7ec0: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
7ed0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
7ee0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
7ef0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f10: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
7f20: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
7f30: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
7f40: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
7f50: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
7f60: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
7f70: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
7f80: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
7f90: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
7fa0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
7fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
7fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7fe0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
7ff0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
8000: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
8010: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
8020: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
8030: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
8040: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
8050: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
8060: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
8070: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
8080: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
8090: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
80a0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
80b0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
80c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
80d0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
80e0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
80f0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
8100: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
8110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
8120: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
8130: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
8140: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
8150: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
8160: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
8170: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
8180: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
8190: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
81a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
81b0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
81c0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
81d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
81e0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
81f0: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
8200: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
8210: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
8220: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
8230: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
8240: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
8250: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
8260: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
8270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8290: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
82a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
82b0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
82c0: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
82d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
82e0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
82f0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
8300: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8330: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
8340: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
8350: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
8360: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
8370: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
8380: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
8390: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
83a0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
83b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
83c0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
83d0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
83e0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
83f0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
8400: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
8410: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
8420: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8430: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
8440: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8450: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
8460: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
8470: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
8480: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
8490: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
84a0: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84c0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
84d0: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
84e0: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
84f0: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
8500: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
8510: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
8520: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
8530: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
8540: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
8550: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
8560: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
8570: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
8580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
8590: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
85a0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
85b0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
85c0: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
85d0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
85e0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
85f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8600: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
8610: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
8620: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
8630: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
8640: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
8650: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
8660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
8670: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
8680: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
8690: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
86a0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
86b0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
86c0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
86d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
86e0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
86f0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
8700: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
8710: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
8720: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
8730: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
8740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
8750: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
8760: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
8770: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
8780: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
8790: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
87a0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
87b0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
87c0: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
87d0: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65  en") and the the
87e0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
87f0: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
8800: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
8810: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
8820: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
8830: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
8840: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
8850: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
8860: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
8870: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
88a0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
88b0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
88c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
88d0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
88e0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
88f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8900: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8910: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8920: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8930: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8940: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8960: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8970: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8980: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8990: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
89c0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
89d0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
89e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
8a00: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
8a10: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
8a20: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
8a30: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
8a40: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
8a50: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
8a60: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
8a70: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
8a80: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
8a90: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
8aa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
8ab0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
8ac0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
8ad0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
8ae0: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
8af0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8b00: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
8b10: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
8b20: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
8b30: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
8b40: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
8b50: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
8b60: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
8b70: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
8b80: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
8b90: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
8ba0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
8bb0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
8bc0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
8bd0: 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 73  the the GNU vers
8be0: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
8bf0: 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72  r() that .  ** r
8c00: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
8c10: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
8c20: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
8c30: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
8c40: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
8c50: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
8c60: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
8c70: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
8c80: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
8c90: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
8ca0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
8cb0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
8cc0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
8cd0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
8ce0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
8cf0: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
8d00: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
8d10: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
8d20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8d30: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
8d40: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
8d50: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
8d60: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
8d70: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
8d80: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
8d90: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
8da0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8db0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
8dc0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
8dd0: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
8de0: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
8df0: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
8e00: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
8e10: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
8e20: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
8e30: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
8e40: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
8e50: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
8e60: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
8e70: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
8e80: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
8e90: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
8ea0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
8eb0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
8ec0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
8ed0: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
8ee0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
8ef0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
8f00: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
8f10: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
8f20: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
8f30: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
8f40: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
8f50: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
8f60: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8f70: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
8f80: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
8f90: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
8fa0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
8fb0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
8fc0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
8fd0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
8fe0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
8ff0: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
9000: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
9010: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
9020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
9030: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
9040: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
9050: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
9060: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
9070: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
9080: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
9090: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
90a0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
90b0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
90c0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
90d0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
90e0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
90f0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
9100: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
9110: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
9120: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9130: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
9140: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
9150: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
9160: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
9170: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
9180: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9190: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
91a0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
91b0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
91c0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
91d0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
91e0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
91f0: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
9200: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9210: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
9220: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
9230: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
9240: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
9250: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
9260: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
9270: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9280: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
92b0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
92c0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
92d0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
92e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
92f0: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9300: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9310: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
9320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
9330: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
9340: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9350: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9360: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9370: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
9380: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9390: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
93a0: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
93b0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
93c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
93d0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
93e0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
93f0: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
9400: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
9410: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
9420: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
9430: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
9440: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
9450: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
9460: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
9470: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
9480: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
9490: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
94a0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
94b0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
94c0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
94d0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
94e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
94f0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
9500: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
9510: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
9520: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
9530: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
9540: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
9550: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
9560: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
9570: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
9580: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
9590: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
95a0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
95b0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
95c0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
95d0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
95e0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
95f0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
9600: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
9610: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9620: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
9630: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
9640: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
9650: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
9660: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
9690: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
96a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
96b0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
96c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
96d0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
96e0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
96f0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9700: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
9710: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9720: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
9730: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
9740: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9760: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
9770: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
9780: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
9790: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
97a0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
97b0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
97c0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
97d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
97e0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
97f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
9800: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
9810: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
9820: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
9830: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
9840: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
9850: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
9860: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9870: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
9880: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
9890: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
98a0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
98b0: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
98c0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
98d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
98e0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
98f0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9910: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
9920: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
9930: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
9940: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
9950: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
9960: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
9970: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9980: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
9990: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99b0: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
99c0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
99d0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
9a00: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
9a10: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
9a20: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
9a30: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
9a40: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
9a50: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
9a60: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
9a80: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
9a90: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
9aa0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
9ab0: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
9ac0: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
9ad0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
9ae0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
9af0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
9b00: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
9b10: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
9b20: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
9b30: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
9b40: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
9b50: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
9b60: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9b70: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
9b80: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
9b90: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
9ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9bb0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9bc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65  o = errno;.#ifde
9bd0: 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20  f EOVERFLOW.    
9be0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
9bf0: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
9c00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9c10: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
9c20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c30: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
9c40: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
9c50: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
9c60: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
9c70: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
9c80: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
9c90: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
9ca0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
9cb0: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
9cc0: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
9cd0: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
9ce0: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
9cf0: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
9d00: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
9d10: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
9d20: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
9d30: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
9d40: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
9d50: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
9d60: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
9d70: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9d80: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
9d90: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
9da0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
9db0: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
9dc0: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
9dd0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
9de0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
9df0: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
9e00: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
9e10: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
9e20: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
9e30: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
9e40: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
9e50: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
9e60: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
9e70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
9e80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
9e90: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
9ea0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
9eb0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
9ec0: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
9ed0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
9ee0: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
9ef0: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
9f00: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
9f10: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
9f20: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
9f30: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
9f40: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
9f50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9f60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
9f70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9f80: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
9f90: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
9fa0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
9fb0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
9fc0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9fd0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9fe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9ff0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
a000: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
a010: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
a020: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a030: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
a040: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
a050: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
a060: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
a070: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
a080: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
a090: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
a0a0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
a0b0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
a0c0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
a0d0: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
a0e0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
a0f0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
a100: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
a110: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
a120: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
a130: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
a140: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
a150: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
a160: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
a170: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
a180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
a1a0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
a1b0: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
a1c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
a1d0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
a1e0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
a1f0: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
a200: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
a210: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
a220: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
a230: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
a240: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
a250: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
a260: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a270: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
a280: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
a290: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
a2a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
a2b0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
a2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
a2e0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
a2f0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
a300: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
a310: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
a320: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
a330: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
a340: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
a350: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
a360: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
a370: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
a380: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
a390: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
a3a0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
a3b0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
a3c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
a3d0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
a3e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
a3f0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
a400: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
a410: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
a420: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
a430: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
a440: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
a450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a460: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
a470: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a480: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a490: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
a4a0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
a4b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a4c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
a4d0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
a4e0: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
a4f0: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
a500: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
a510: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
a520: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
a530: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
a540: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
a550: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
a560: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
a570: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
a580: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
a590: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
a5a0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
a5b0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
a5c0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
a5d0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
a5e0: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
a5f0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
a600: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
a610: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
a620: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
a630: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
a640: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
a650: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a660: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
a670: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
a680: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
a690: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
a6a0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
a6b0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
a6c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a6d0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
a6e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a6f0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
a700: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20  ESERVEDLOCK;.   
a710: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a730: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
a740: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
a750: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
a760: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
a770: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
a780: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a790: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
a7a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
a7b0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
a7c0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
a7d0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
a7e0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
a7f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a800: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
a810: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
a820: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
a830: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
a840: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
a850: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
a860: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
a870: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
a880: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
a890: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
a8a0: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
a8b0: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
a8c0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
a8d0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
a8e0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
a8f0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a900: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
a910: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
a920: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
a930: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
a940: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
a950: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
a960: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
a970: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
a980: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
a990: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
a9a0: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
a9b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a9c0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
a9d0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
a9e0: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
a9f0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
aa00: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
aa10: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
aa20: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
aa30: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
aa40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
aa50: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
aa60: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
aa70: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
aa80: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
aa90: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
aaa0: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
aab0: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
aac0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
aad0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
aae0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
aaf0: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
ab00: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
ab10: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
ab20: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
ab30: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
ab40: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
ab50: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
ab60: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab80: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
ab90: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
aba0: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
abb0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
abc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
abd0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
abe0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
abf0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
ac00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ac10: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
ac20: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
ac30: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45  ags & UNIXFILE_E
ac40: 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64  XCL)!=0 || pInod
ac50: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29  e->bProcessLock)
ac60: 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  .   && ((pFile->
ac70: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
ac80: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29  FILE_RDONLY)==0)
ac90: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  .  ){.    if( pI
aca0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
acb0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
acc0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
acd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ace0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
acf0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
ad00: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ad10: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
ad20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ad30: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
ad40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ad50: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
ad60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
ad70: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
ad80: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ad90: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
adb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
adc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
add0: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
ade0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
adf0: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
ae00: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
ae10: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ae20: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
ae30: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
ae40: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
ae50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ae60: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
ae70: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
ae80: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
ae90: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
aea0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
aeb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
aec0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
aed0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
aee0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
aef0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
af00: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
af10: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
af20: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
af30: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
af40: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
af50: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
af60: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
af70: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
af80: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
af90: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
afa0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
afb0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
afc0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
afd0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
afe0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
aff0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
b000: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
b010: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
b020: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
b030: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
b040: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
b050: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
b060: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
b070: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
b080: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
b090: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
b0a0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
b0b0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b0c0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b0d0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
b0e0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
b0f0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
b100: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
b110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b120: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
b130: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
b140: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
b150: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
b160: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
b170: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
b180: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
b190: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b1a0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
b1b0: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
b1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
b1d0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
b1e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
b1f0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
b200: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
b210: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
b220: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
b230: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
b240: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
b250: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
b260: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
b270: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
b280: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
b290: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
b2a0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
b2b0: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
b2c0: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
b2d0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
b2e0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
b2f0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
b300: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
b310: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
b320: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
b330: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
b340: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
b350: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
b360: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
b370: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
b380: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
b390: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
b3a0: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
b3b0: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
b3c0: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
b3d0: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
b3e0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
b3f0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
b400: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b410: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
b420: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
b430: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
b440: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
b450: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
b460: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
b470: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
b480: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
b490: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
b4a0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
b4b0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
b4c0: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
b4d0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
b4e0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
b4f0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
b500: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b510: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
b520: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b530: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b540: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
b550: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
b560: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
b570: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
b580: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
b590: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
b5a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
b5b0: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
b5c0: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
b5d0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
b5e0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
b5f0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
b600: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
b610: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
b620: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
b630: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b640: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
b650: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
b660: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b670: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
b680: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
b690: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
b6a0: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
b6b0: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
b6c0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
b6d0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
b6e0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
b6f0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
b700: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
b710: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
b720: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
b730: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
b740: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
b750: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
b760: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
b770: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
b780: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
b790: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
b7a0: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
b7b0: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
b7c0: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
b7d0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
b7e0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
b7f0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
b800: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
b810: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
b820: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
b830: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
b840: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
b850: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
b860: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
b870: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
b880: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
b890: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
b8a0: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
b8b0: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
b8c0: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
b8d0: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
b8e0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
b8f0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
b900: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
b910: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b920: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
b930: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
b940: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
b950: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
b960: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
b970: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b980: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
b990: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
b9a0: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
b9b0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
b9c0: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
b9d0: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
b9e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
b9f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ba00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
ba10: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ba20: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
ba30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ba40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ba50: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
ba60: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
ba70: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
ba80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ba90: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
baa0: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
bab0: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
bac0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
bad0: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
bae0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
baf0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
bb00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
bb10: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
bb20: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
bb30: 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
bb40: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
bb50: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
bb60: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
bb70: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
bb80: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
bb90: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
bba0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
bbb0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
bbc0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
bbd0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
bbe0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
bbf0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
bc00: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
bc10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
bc20: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
bc30: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
bc40: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
bc50: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
bc60: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
bc70: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
bc80: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
bc90: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
bca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bcb0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
bcc0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
bcd0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
bce0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
bcf0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
bd00: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
bd10: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
bd20: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
bd30: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
bd40: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
bd50: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
bd60: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
bd70: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
bd80: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
bd90: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
bda0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
bdb0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
bdc0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
bdd0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
bde0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
bdf0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
be00: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
be10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
be20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
be30: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
be40: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
be50: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
be60: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
be70: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
be80: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
be90: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
bea0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
beb0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
bec0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
bed0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
bee0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
bef0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
bf00: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
bf10: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
bf20: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
bf30: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
bf40: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
bf50: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
bf60: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
bf70: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
bf80: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
bf90: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
bfa0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
bfb0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
bfc0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
bfd0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
bfe0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
bff0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c000: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c010: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
c020: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
c030: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
c040: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
c050: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
c060: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
c070: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
c080: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
c090: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
c0a0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
c0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
c0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
c0d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c0e0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
c0f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
c100: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c110: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c120: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c130: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c140: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c150: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
c160: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c170: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c180: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c190: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
c1a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c1b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c1c0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
c1d0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
c1e0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c1f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c200: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
c210: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
c220: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
c230: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
c240: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
c250: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c260: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c270: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c280: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c290: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
c2a0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
c2b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
c2c0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
c2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c2e0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
c2f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
c300: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
c310: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c320: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
c330: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
c340: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
c350: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
c360: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c370: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
c380: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
c390: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
c3a0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
c3b0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
c3c0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
c3d0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c3e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c3f0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
c400: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
c410: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
c420: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c430: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c440: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c450: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c470: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c480: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
c490: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
c4a0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
c4b0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
c4c0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
c4d0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
c4e0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
c4f0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
c500: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
c510: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c520: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
c530: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
c540: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
c550: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
c560: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c570: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
c580: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
c590: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
c5a0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
c5b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c5c0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c5d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
c5e0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
c5f0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c600: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c610: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c620: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c630: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c640: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c650: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c660: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
c670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
c680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
c690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
c6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
c6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
c6f0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c700: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
c710: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c720: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
c730: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
c740: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
c750: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
c760: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c770: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
c780: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
c790: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
c7a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c7b0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c7c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c7d0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
c7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c7f0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
c800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
c810: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
c820: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c830: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c840: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
c850: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
c860: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c870: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
c880: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
c890: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
c8a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
c8b0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
c8c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
c8d0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
c8e0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
c8f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
c900: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
c910: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
c920: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c930: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
c940: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
c950: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
c960: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
c970: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
c980: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
c990: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
c9a0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
c9b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
c9c0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
c9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c9e0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
c9f0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
ca00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ca10: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
ca20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
ca30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
ca40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ca50: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
ca60: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ca70: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
ca80: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ca90: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
caa0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
cab0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
cac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
cad0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
cae0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
caf0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
cb00: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
cb10: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
cb20: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
cb30: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
cb40: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
cb50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
cb60: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
cb70: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
cb80: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
cb90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cba0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
cbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
cbc0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
cbd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cbe0: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
cbf0: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
cc00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
cc10: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
cc20: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
cc30: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
cc40: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
cc50: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
cc60: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
cc70: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
cc80: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
cc90: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
cca0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
ccb0: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
ccc0: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
ccd0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
cce0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
ccf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
cd00: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
cd10: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
cd20: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
cd30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
cd40: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
cd50: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
cd60: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
cd70: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
cd80: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
cd90: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
cda0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
cdb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cdc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cdd0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
cde0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
cdf0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
ce00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
ce10: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
ce20: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
ce30: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ce40: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
ce50: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ce60: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
ce70: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
ce80: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
ce90: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
cea0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
ceb0: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
cec0: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
ced0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
cee0: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
cef0: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
cf00: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
cf10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cf20: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
cf30: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
cf40: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
cf50: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
cf60: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
cf70: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
cf80: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
cf90: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
cfa0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
cfb0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
cfc0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
cfd0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
cfe0: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
cff0: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
d000: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
d010: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
d020: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
d030: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
d040: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
d050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
d060: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d070: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
d080: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
d090: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
d0a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
d0b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
d0c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
d0d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
d0e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
d0f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d100: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
d110: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
d120: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d130: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d140: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d150: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
d160: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
d170: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
d180: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
d190: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
d1a0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
d1b0: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
d1c0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
d1d0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
d1e0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
d1f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
d200: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
d210: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
d220: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
d230: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
d240: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
d250: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
d260: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
d270: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
d280: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
d290: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
d2a0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
d2b0: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
d2c0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
d2d0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
d2e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
d2f0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
d300: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
d310: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
d320: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d330: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
d340: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
d350: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
d360: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
d370: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d380: 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72   int h;..  asser
d390: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
d3a0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
d3b0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
d3c0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
d3d0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
d3e0: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
d3f0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d400: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
d410: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
d420: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
d430: 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69  red,.      getpi
d440: 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
d450: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d460: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
d470: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d480: 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
d490: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d4a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
d4b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
d4c0: 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20   h = pFile->h;. 
d4d0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
d4e0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
d4f0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
d500: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
d510: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
d520: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d530: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d540: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
d550: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
d560: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d570: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d580: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d590: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
d5a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d5b0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66  rBenign(0);..#if
d5c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
d5d0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
d5e0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
d5f0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
d600: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
d610: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
d620: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
d630: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
d640: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
d650: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
d660: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
d670: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
d680: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
d690: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
d6a0: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
d6b0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
d6c0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
d6d0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
d6e0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
d6f0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
d700: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
d710: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
d720: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
d730: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
d740: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
d750: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
d760: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
d770: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
d780: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
d790: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
d7a0: 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72 74  #if 0.    assert
d7b0: 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
d7c0: 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
d7d0: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
d7e0: 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
d7f0: 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
d800: 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
d810: 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c 65  #endif.    pFile
d820: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
d830: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
d840: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
d850: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
d860: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
d870: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
d880: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
d890: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
d8a0: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
d8b0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
d8c0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
d8d0: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
d8e0: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
d8f0: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
d900: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
d910: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
d920: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
d930: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
d940: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
d950: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
d960: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
d970: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
d980: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
d990: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
d9a0: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
d9b0: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
d9c0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d9d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d9e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
d9f0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
da00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
da10: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
da20: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
da30: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
da40: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
da50: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
da60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
da70: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
da80: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
da90: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
daa0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dac0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
dad0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
dae0: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
daf0: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
db00: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
db10: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
db20: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
db30: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
db40: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
db50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
db60: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
db70: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db80: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
db90: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
dba0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
dbb0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
dbc0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dbd0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
dbf0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dc00: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
dc10: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dc20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
dc30: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
dc40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dc50: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
dc60: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
dc70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
dc90: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
dca0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
dcb0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
dcc0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
dcd0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
dce0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
dcf0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dd00: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
dd10: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
dd30: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
dd40: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
dd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
dd60: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
dd70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd80: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
dd90: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
dda0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ddb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
ddc0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ddd0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dde0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ddf0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
de00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
de20: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
de30: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
de40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
de50: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
de60: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
de70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
de80: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
de90: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
dea0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
deb0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
dec0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
ded0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
dee0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
def0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
df00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
df10: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
df20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
df30: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
df40: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
df50: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
df60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
df70: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
dfa0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
dfb0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
dfc0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
dfd0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
dfe0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
dff0: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
e000: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
e010: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
e020: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e030: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e040: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e050: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
e060: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
e070: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e080: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
e090: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e0a0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e0c0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
e0d0: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
e0e0: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
e0f0: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
e100: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
e110: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
e120: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
e130: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
e140: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
e150: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
e160: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
e170: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
e180: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
e190: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
e1a0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
e1b0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
e1c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e1d0: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
e1e0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
e1f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
e200: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
e210: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
e220: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
e230: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
e240: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
e250: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
e260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e270: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
e280: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e290: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e2a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e2b0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e2c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e2d0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
e2e0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e2f0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e300: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e310: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
e320: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
e330: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
e340: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
e350: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
e360: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
e370: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e380: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e390: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
e3a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
e3b0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
e3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
e3d0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
e3e0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  NLOCK;.      pFi
e3f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e400: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74  errno;.      got
e410: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e420: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
e430: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
e440: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
e450: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
e460: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
e470: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
e480: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
e490: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
e4a0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
e4b0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
e4c0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
e4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
e4f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
e500: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
e510: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
e520: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e530: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
e540: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e550: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e560: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e570: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
e580: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e590: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
e5a0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5b0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
e5c0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5d0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
e5f0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e600: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
e610: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e620: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
e630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e650: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
e660: 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  .pFile->lastErrn
e670: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e680: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e690: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
e6a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
e6b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
e6c0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
e6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
e6e0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
e6f0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
e700: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
e710: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
e720: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
e730: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
e740: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
e750: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
e760: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
e770: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
e780: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
e790: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
e7a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
e7b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
e7c0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
e7d0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
e7e0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
e7f0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
e800: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
e810: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
e820: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e830: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
e840: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
e850: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
e860: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
e870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e880: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e890: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e8a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e8b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e8c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e8d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e8e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e8f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e900: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e910: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e920: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e930: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e940: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e950: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e960: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e970: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
e980: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
e990: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e9a0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
e9b0: 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
e9c0: 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
e9d0: 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck, 0);.}../*.**
e9e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
e9f0: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
ea00: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
ea10: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
ea20: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
ea30: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
ea40: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
ea50: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
ea60: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
ea70: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
ea80: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
ea90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
eaa0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
eab0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
eac0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
ead0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
eae0: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
eaf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
eb00: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
eb10: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
eb20: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
eb30: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
eb40: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
eb50: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
eb60: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
eb70: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
eb80: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
eb90: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
eba0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ebb0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
ebc0: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
ebd0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
ebe0: 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
ebf0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
ec00: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
ec10: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
ec20: 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
ec30: 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
ec40: 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  ile->isDelete ){
ec50: 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
ec60: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
ec70: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
ec80: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
ec90: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
eca0: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
ecb0: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
ecc0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
ecd0: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
ece0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
ecf0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
ed00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
ed10: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
ed20: 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
ed30: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
ed40: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ed60: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
ed70: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ed80: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
ed90: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
edb0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
edc0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
edd0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
ede0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
edf0: 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
ee00: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
ee10: 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
ee20: 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
ee30: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
ee40: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
ee50: 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
ee60: 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
ee70: 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
ee80: 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
ee90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
eea0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
eeb0: 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
eec0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
eed0: 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
eee0: 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
eef0: 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
ef00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
ef10: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
ef20: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
ef30: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
ef40: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
ef50: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
ef60: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
ef70: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
ef80: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
ef90: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
efa0: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
efb0: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
efc0: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
efd0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
efe0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
eff0: 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
f000: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
f010: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f020: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
f030: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
f040: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
f050: 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
f060: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
f070: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
f080: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f090: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
f0a0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
f0b0: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
f0c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
f1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1d0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
f1e0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
f1f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
f200: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
f210: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
f220: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
f230: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
f240: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
f250: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
f260: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
f270: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
f280: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
f290: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
f2a0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
f2b0: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
f2c0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
f2d0: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
f2e0: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
f2f0: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
f300: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
f310: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
f320: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
f330: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
f340: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
f350: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
f360: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
f370: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
f380: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
f390: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
f3a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f3b0: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
f3c0: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
f3d0: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
f3e0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
f3f0: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
f400: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
f410: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
f420: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
f430: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f440: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
f450: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
f460: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
f470: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
f480: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
f490: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
f4a0: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
f4b0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
f4c0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
f4d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
f4e0: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
f4f0: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
f500: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
f510: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
f520: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
f530: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f540: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
f550: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
f560: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
f570: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
f580: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
f590: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
f5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f5b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
f5c0: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
f5d0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f5e0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f5f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f600: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f610: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f630: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
f640: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f650: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
f660: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f670: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
f680: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
f690: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f6b0: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
f6c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
f7a0: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
f7b0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
f7e0: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
f7f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
f800: 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
f810: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
f820: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
f830: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
f840: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
f850: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
f860: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
f870: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
f880: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
f890: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
f8a0: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
f8b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
f8c0: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
f8d0: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
f8e0: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
f8f0: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
f900: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
f910: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
f920: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
f930: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
f940: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
f950: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
f960: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
f970: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
f980: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
f990: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
f9a0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
f9b0: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
f9c0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
f9d0: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
f9e0: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
f9f0: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
fa00: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
fa10: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
fa20: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
fa30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
fa40: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
fa50: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
fa60: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
fa70: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
fa80: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
fa90: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
faa0: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
fab0: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
fac0: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
fad0: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
fae0: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
faf0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
fb00: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
fb10: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
fb20: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
fb30: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
fb40: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
fb50: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
fb60: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
fb70: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
fb80: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
fb90: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
fba0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
fbb0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
fbc0: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
fbd0: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
fbe0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fbf0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
fc00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
fc10: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
fc20: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
fc30: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
fc40: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
fc50: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
fc60: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
fc70: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
fc80: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
fc90: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
fca0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
fcb0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
fcc0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
fcd0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
fce0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fcf0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
fd00: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
fd10: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
fd20: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
fd30: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
fd40: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
fd50: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
fd60: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
fd70: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
fd80: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
fd90: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
fda0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
fdb0: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
fdc0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
fdd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
fde0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
fdf0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
fe00: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
fe10: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
fe20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fe30: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
fe40: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fe50: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fe60: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
fe70: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
fe80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
fe90: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
fea0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
feb0: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
fec0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
fed0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
fee0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
fef0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
ff00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
ff10: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ff20: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
ff30: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
ff40: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
ff50: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
ff60: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
ff70: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
ff80: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
ff90: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
ffa0: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
ffb0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
ffc0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
ffd0: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
ffe0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
fff0: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
10000 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10010 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
10020 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
10030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10040 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
10050 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
10060 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
10070 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
10080 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
10090 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
100a0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
100b0 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
100c0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
100d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
100e0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
100f0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
10100 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10110 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
10120 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10130 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10140 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10150 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10160 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10170 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10180 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10190 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
101a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
101b0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
101c0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
101d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
101e0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
101f0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10200 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10210 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10220 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10230 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10240 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10250 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10260 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10270 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10280 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10290 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
102a0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
102b0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
102c0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
102d0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
102e0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
102f0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10300 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10310 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10320 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10330 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10340 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10350 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10360 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10370 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10380 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10390 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
103a0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
103b0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
103c0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
103d0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
103e0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
103f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
10400 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
10410 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
10420 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
10430 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
10440 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
10450 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
10460 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
10470 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
10480 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10490 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
104a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
104b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
104c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
104d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
104e0 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
104f0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
10500 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
10510 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
10520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10530 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
10540 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
10550 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
10560 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
10570 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
10580 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
10590 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
105a0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
105b0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
105c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
105d0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
105e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
105f0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10600 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
10610 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10620 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10630 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
10640 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
10650 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
10660 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
10670 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
10680 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
10690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
106a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
106b0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
106c0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66  sive lock */.  f
106d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
106e0 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e  zLockFile,O_RDON
106f0 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
10700 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
10710 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
10720 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
10730 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
10740 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
10750 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
10760 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ock */.    int t
10770 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10780 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
10790 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
107a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
107b0 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
107c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
107e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
107f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
10800 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
10810 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10820 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
10830 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10840 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
10850 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10860 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c    } .  robust_cl
10870 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
10880 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f  _LINE__);.  .  /
10890 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
108a0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
108b0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
108c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
108d0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
108e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
108f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10900 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10910 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10920 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10930 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10940 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10950 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
10960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
10970 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
10980 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10990 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
109a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
109b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
109c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
109d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
109e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
109f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10a00 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
10a10 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
10a20 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
10a30 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
10a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10a50 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
10a60 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
10a70 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10a80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10a90 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10aa0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10ab0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
10ac0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10ad0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
10ae0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
10af0 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
10b00 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
10b10 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
10b20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10b30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
10b40 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
10b50 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
10b60 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
10b70 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
10b80 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
10b90 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
10ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
10bc0 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
10bd0 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
10be0 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
10bf0 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
10c00 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
10c10 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
10c20 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
10c30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
10c40 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10c50 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
10c60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
10c70 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
10c80 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
10c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10ca0 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
10cb0 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
10cc0 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
10cd0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
10ce0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
10cf0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
10d00 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c   if( osUnlink(zL
10d10 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
10d20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
10d30 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10d40 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10d50 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10d70 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10d90 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10da0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10db0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
10dc0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
10dd0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10de0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10df0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10e20 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
10e30 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
10e40 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
10e50 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
10e60 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10e70 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
10e80 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
10e90 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
10ea0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10eb0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10ec0 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
10ed0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10ee0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
10ef0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
10f00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
10f10 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
10f20 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
10f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
10f60 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
10f70 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
11050 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11080 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
11090 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
110a0 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
110b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
110c0 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
110d0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
110e0 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
110f0 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
11100 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
11110 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
11120 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
11130 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
11140 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
11150 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
11160 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
11170 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
11180 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
11190 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
111a0 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
111b0 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
111c0 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
111d0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
111e0 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
111f0 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
11200 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
11210 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
11220 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
11230 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
11240 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
11250 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
11260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11270 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
11280 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
11290 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
112a0 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
112b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
112c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
112d0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
112e0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
112f0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
11300 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
11310 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
11320 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
11330 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
11340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
11350 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
11360 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
11370 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
11380 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
11390 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
113a0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
113b0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
113c0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
113d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
113e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
113f0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11400 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11410 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11420 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11430 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11440 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11450 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11460 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11470 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11480 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11490 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
114a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
114b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
114c0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
114d0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
114e0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
114f0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
11500 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
11510 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11520 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11530 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11550 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11560 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11570 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11580 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
115a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
115b0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
115c0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
115d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
115e0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
115f0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
11600 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
11610 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
11620 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11630 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11640 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11650 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11660 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11670 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11680 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11690 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
116a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
116b0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
116c0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
116d0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
116e0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
116f0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
11700 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
11710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
11720 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
11730 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
11740 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11750 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11760 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
11770 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
11780 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11790 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
117a0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
117b0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
117c0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
117d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
117e0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
117f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
11800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11810 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11820 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11830 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11850 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11870 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11880 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11890 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
118a0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
118b0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
118c0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
118d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
118e0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
118f0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
11900 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11910 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
11920 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11930 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11940 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11960 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11970 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11980 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11990 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
119a0 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
119b0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
119c0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
119d0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
119e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
119f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11a00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11a10 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
11a20 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11a30 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11a40 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11a50 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11a60 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11a80 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11a90 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11aa0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11ab0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11ac0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11ad0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
11ae0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
11af0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
11b00 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
11b10 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
11b20 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11b30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11b40 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11b50 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11b60 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11b70 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11b80 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11b90 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11ba0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11bb0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11bc0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
11be0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
11bf0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
11c00 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
11c10 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
11c20 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11c30 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11c40 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11c50 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11c60 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11c70 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11c80 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11c90 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11ca0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11cb0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11cc0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11cd0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ce0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11cf0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11d00 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11d10 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11d20 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11d30 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11d40 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11d50 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11d60 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11d70 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11d80 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11d90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11da0 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11db0 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
11dc0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
11dd0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
11de0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
11df0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
11e00 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
11e10 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11e20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e30 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11e40 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11e50 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11e60 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11e70 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11e80 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11e90 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11ea0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11eb0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11ec0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
11ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11ee0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11ef0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11f00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11f10 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11f20 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11f30 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11f40 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11f50 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11f60 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11f70 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11f80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11f90 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11fa0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11fb0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11fd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11fe0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11ff0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
12000 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
12010 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12020 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
12030 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
12040 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
12050 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
12060 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
12070 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12080 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12090 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
120a0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
120b0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
120c0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
120d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
120e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
120f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
12100 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
12110 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
12120 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
12130 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12140 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
12150 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
12160 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
12170 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12180 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12190 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
121a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
121b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
121c0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
121d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
121e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
121f0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12200 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12210 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12220 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12230 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12240 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12250 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12270 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12280 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12290 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
122a0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
122b0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
122c0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
122d0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
122e0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
122f0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12300 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12310 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12320 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12330 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12340 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12350 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12360 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12370 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12380 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
12390 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
123a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
123b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
123c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
123d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
123e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
123f0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12400 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
12410 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12420 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12430 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12440 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12450 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12460 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12470 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12480 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12490 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
124a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
124b0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
124c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
124d0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
124e0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
124f0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
12500 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
12510 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12520 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12530 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12540 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12550 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12570 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12580 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12590 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
125a0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
125b0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
125c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
125d0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
125e0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
125f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
12600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12610 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12620 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
12630 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12640 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
12650 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
12660 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12670 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
12680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
12690 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
126a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
126b0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
126c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
126d0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
126e0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
126f0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
12700 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
12710 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
12720 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12730 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12740 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12750 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12770 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
12780 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12860 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
12870 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
128a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
128b0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
128c0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
128d0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
128e0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
128f0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
12900 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
12910 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
12920 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
12930 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
12940 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12950 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
12960 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
12970 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
12980 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
12990 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
129a0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
129b0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
129c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
129d0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
129e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
129f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a00 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
12a10 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
12a20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12a30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12a40 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12a50 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12a60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12a70 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12a80 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12a90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12aa0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12ab0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12ac0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12ad0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
12ae0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12af0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12b00 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12b10 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12b20 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12b30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12b40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12b50 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12b80 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12b90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12ba0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12bb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12bd0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12be0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12bf0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12c00 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12c10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12c20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12c30 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12c40 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12c50 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12c60 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12c70 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12c80 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12c90 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12ca0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12cb0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12cc0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
12cd0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
12ce0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
12cf0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
12d00 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
12d10 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12d20 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
12d30 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12d40 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
12d50 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
12d60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12d70 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12d80 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12d90 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12da0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
12db0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12dc0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12dd0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
12df0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
12e00 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
12e10 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
12e20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12e30 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
12e40 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
12e50 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
12e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12e70 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12e80 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12e90 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
12ea0 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
12eb0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12ec0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ed0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
12ee0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12ef0 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
12f00 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f20 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12f30 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12f40 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12f50 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12f60 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12f70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12f80 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12f90 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12fa0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12fb0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12fc0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12fd0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12fe0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ff0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13000 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13010 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13020 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13030 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13040 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13050 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13060 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
13070 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
13080 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
13090 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
130a0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
130b0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
130c0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
130d0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
130e0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
130f0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13100 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13110 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13120 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13130 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13140 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13150 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13160 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13170 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13180 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13190 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
131a0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
131b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
131c0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
131d0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
131e0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
131f0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
13200 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
13210 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
13220 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13230 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13240 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13250 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13260 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13270 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13280 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13290 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
132a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
132b0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
132c0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
132d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
132e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
132f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
13300 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
13310 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
13320 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13330 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13340 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13360 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13370 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13380 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13390 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
133a0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
133b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
133c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
133d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
133e0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
133f0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
13400 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
13410 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
13420 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13430 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13440 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13450 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13460 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13470 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13480 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13490 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
134a0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
134b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
134c0 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
134d0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
134e0 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
134f0 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
13500 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
13510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13520 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
13530 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13540 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
13550 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13560 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13570 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13580 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
13590 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
135a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
135b0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
135c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
135d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
135e0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
135f0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
13600 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13610 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
13620 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13630 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13640 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13650 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13660 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13670 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13680 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13690 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
136a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
136b0 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
136c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
136d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
136e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
136f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13700 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
13710 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13720 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
13730 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
13750 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13760 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13770 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
13780 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13790 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
137a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
137b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
137c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
137d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
137e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
137f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
13800 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13810 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
13820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13840 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13850 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13860 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13870 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13880 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13890 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
138a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
138b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
138c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
138d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
138e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
138f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
13900 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
13910 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
13920 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
13930 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13940 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13950 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13960 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
13970 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
13980 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13990 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
139a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
139b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
139c0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
139d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
139e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
139f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a00 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
13a10 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
13a20 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
13a30 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13a40 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
13a50 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13a60 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13a70 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
13a80 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13aa0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
13ab0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13ac0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
13ad0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
13ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13af0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
13b00 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
13b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
13b30 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
13b40 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13b50 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13b60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
13b70 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13b90 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
13ba0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
13bb0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
13c90 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13cc0 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
13cd0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
13ce0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
13cf0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
13d00 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
13d10 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
13d20 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
13d30 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
13d40 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
13d50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
13d60 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
13d70 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
13d80 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
13d90 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
13da0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
13db0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
13dc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13dd0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
13de0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13df0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
13e00 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
13e10 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
13e20 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
13e30 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13e40 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
13e50 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
13e60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13e70 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
13e80 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
13e90 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
13ea0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13eb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
13ec0 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
13ed0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
13ee0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13ef0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
13f00 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
13f10 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
13f20 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13f30 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
13f40 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
13f50 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
13f60 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13f70 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
13f80 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
13f90 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
13fa0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
13fb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
13fc0 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
13fe0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
13ff0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14000 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14010 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14020 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14030 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14040 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14070 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14080 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
14090 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
140a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
140b0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
140c0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
140d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
140e0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
140f0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
14100 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
14110 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
14120 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
14130 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
14140 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
14150 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14160 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
14170 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
14180 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
14190 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
141a0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
141b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
141c0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
141d0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
141e0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
141f0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
14200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
14210 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
14220 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14230 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14240 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14250 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14260 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14270 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14280 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14290 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
142a0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
142b0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
142c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
142d0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
142e0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
142f0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
14300 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14310 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
14320 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14330 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14340 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14350 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14360 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14370 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14380 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14390 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
143a0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
143b0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
143c0 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
143d0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
143e0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
143f0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
14400 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
14410 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
14420 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14430 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14440 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14450 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14460 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14470 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14480 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14490 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
144a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
144b0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
144c0 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
144d0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
144e0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
144f0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
14500 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
14510 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
14520 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14530 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14540 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14550 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14560 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14570 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14590 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
145a0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
145b0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
145c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
145d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
145e0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
145f0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
14600 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
14610 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
14620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14630 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14640 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14650 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14680 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14690 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
146a0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
146b0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
146c0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
146d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
146e0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
146f0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
14700 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
14710 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
14720 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
14730 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
14740 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
14750 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
14760 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
14770 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
14780 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14790 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
147a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
147b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
147c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
147d0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
147e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
147f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14800 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14810 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14820 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14830 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
14840 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
14850 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14860 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14870 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14880 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14890 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
148a0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
148b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
148c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
148d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
148e0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
148f0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
14900 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
14910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14920 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
14930 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
14940 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
14950 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
14960 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
14970 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
14980 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14990 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
149a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
149b0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
149c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
149d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
149e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
149f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
14a00 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
14a10 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
14a20 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
14a30 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14a40 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
14a50 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
14a60 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
14a70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14a80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14a90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14aa0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
14ab0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
14ac0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
14ad0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
14ae0 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
14af0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
14b00 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
14b10 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
14b20 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
14b30 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
14b40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14b50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
14b60 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
14b70 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14b80 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
14b90 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
14ba0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
14bb0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
14bc0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
14bd0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
14be0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
14bf0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
14c00 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
14c10 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
14c20 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
14c30 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14c40 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
14c50 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
14c60 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
14c70 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
14c80 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14ca0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14cb0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
14cc0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
14cd0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
14ce0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
14cf0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
14d00 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14d10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14d20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14d30 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
14d40 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
14d50 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
14d60 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
14d70 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
14d80 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14d90 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14da0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14db0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14dc0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14dd0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14de0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14df0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14e00 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14e10 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14e20 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14e30 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
14e40 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
14e50 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
14e60 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
14e70 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
14e80 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14e90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14ea0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14eb0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14ec0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14ed0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14ee0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14ef0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14f00 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14f10 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14f20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14f30 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
14f40 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
14f50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14f60 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14f70 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14f80 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14f90 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14fa0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14fb0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
14fd0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14fe0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
14ff0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
15000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15010 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15020 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15030 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
15040 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15050 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
15060 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15070 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15080 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15090 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
150a0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
150b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
150c0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
150d0 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
150e0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
150f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15100 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15110 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
15120 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
15130 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
15140 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15150 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
15160 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
15170 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
15180 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
15190 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
151a0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
151b0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
151c0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
151d0 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
151e0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
151f0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
15200 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
15210 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
15220 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15230 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15250 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
15260 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
15270 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15280 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
15290 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
152a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
152b0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
152c0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
152d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
152f0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
15300 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
15310 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
15320 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
15330 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
15340 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
15350 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
15360 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
15370 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
15380 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
15390 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
153a0 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
153b0 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
153c0 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
153d0 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
153e0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
153f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15400 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
15410 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
15420 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15430 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15440 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
15450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15460 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
15470 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
15480 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
15490 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
154a0 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
154b0 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
154c0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
154d0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
154e0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
154f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
15500 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
15510 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
15520 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
15530 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
15540 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
15550 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
15560 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
15570 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
15580 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15590 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
155a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
155b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
155c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
155d0 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
155e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
155f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
15600 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
15610 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
15620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15630 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
15640 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15650 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
15660 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
15670 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
15680 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
15690 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
156a0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
156b0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
156c0 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
156d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
156e0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
156f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
15700 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15710 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
15720 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
15730 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15740 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
15750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
15760 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
15770 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
15780 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15790 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
157a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
157b0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
157c0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
157d0 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
157e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
157f0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
15800 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15810 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
15820 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
15830 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15840 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
15850 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
15860 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
15870 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
15880 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
15890 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
158a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
158b0 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
158c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
158d0 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
158e0 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
158f0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15900 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
15910 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
15920 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15930 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
15940 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
15950 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
15960 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
15970 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
15980 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15990 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
159a0 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
159b0 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
159c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159d0 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
159e0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
159f0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
15a00 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
15a10 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
15a20 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
15a30 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
15a40 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
15a50 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
15a60 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
15a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15a80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15a90 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
15aa0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
15ab0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
15ac0 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
15ad0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
15ae0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
15af0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b00 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15b10 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
15b20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
15b30 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
15b40 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
15b50 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
15b60 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
15b70 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
15b80 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
15b90 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
15ba0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
15bb0 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
15bc0 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
15bd0 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
15be0 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
15bf0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
15c00 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
15c10 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
15c20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
15c30 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15c40 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
15c50 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15c60 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
15c70 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
15c80 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15c90 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
15ca0 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
15cb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15cc0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
15cd0 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
15ce0 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
15cf0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
15d00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15d10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15d20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
15d30 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
15d40 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15d50 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
15d60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15d70 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
15d80 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15d90 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15da0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15db0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
15dc0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
15dd0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
15de0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15df0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15e00 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
15e20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
15e30 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
15e40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15e50 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
15e60 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
15e70 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
15e80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
15e90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
15ea0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
15eb0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15ec0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
15ed0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
15ee0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
15ef0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
15f00 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
15f10 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
15f20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
15f30 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
15f40 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
15f50 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
15f60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
15f70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
15f80 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
15f90 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
15fa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
15fb0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
15fc0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
15fd0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
15fe0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
15ff0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
16000 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
16010 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
16020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
16030 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16040 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
16050 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
16060 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
16070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
16080 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
16090 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
160a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
160b0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
160c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
160d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
160e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
160f0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
16100 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
16110 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
16120 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
16130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16140 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
16150 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
16160 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
16170 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
16180 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
16190 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
161a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
161b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
161c0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
161d0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
161e0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
161f0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
16200 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16210 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
16220 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
16230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16240 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
16250 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16260 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
16270 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
162a0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
162b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
162c0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
162d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
162e0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
162f0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
16300 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
16310 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
16320 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16330 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16340 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16350 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16380 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16390 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
163a0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
163b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
163c0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
163f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16400 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
16410 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
16420 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16430 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
16440 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
16450 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
16460 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
16470 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
16480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16490 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
164a0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
164b0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
164c0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
164e0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
164f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
16500 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16510 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
16520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16530 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
16540 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16550 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
16560 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
16570 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
16580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16590 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
165a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
165b0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
165c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
165d0 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
165e0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
165f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16600 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16610 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
16620 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
16630 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
16640 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
16650 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
16660 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16670 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
16680 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
16690 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
166a0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
166b0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
166c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
166d0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
166e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
166f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16700 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
16710 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
16720 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
16730 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
16740 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
16750 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
16760 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
16770 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
16780 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
16790 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
167a0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
167b0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
167c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
167d0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
167e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
167f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
16800 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
16810 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16820 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16830 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16840 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
16850 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16860 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
16870 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
16880 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16890 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
168a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
168b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
168c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
168d0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
168e0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
168f0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
16900 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
16910 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
16920 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
16930 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
16940 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
16950 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
16960 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
16970 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
16980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
16990 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
169a0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
169b0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
169c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
169d0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
169e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
169f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16a00 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16a10 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
16a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16a40 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a50 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
16a60 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
16a70 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
16a80 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
16a90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16aa0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
16ac0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16ad0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16ae0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
16af0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
16b00 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
16b10 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
16b20 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
16b30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
16b40 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42     .#ifndef NDEB
16b50 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
16b60 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
16b70 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
16b80 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
16b90 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
16ba0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
16bb0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
16bc0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
16bd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
16be0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
16bf0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
16c00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16c10 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
16c20 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
16c30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
16c40 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
16c50 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
16c60 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
16c70 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
16c80 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
16c90 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
16ca0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
16cb0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
16cc0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
16cd0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
16ce0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
16cf0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
16d00 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
16d10 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16d20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
16d30 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
16d40 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
16d50 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
16d60 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
16d70 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16d80 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
16d90 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
16da0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
16db0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
16dc0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
16dd0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16de0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
16df0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16e00 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16e10 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
16e20 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
16e30 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
16e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16e50 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
16e60 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
16e80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
16e90 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
16ea0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16eb0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
16ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
16ed0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
16ee0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
16ef0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
16f00 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
16f10 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16f20 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
16f30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
16f40 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
16f50 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
16f60 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
16f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16f80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16f90 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16fa0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
16fb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
16fc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16fd0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16fe0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
17000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17010 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
17020 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
17030 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
17040 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17050 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
17060 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17070 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17080 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17090 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
170a0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
170b0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
170c0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
170d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
170e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
170f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17100 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17110 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
17120 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17130 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17140 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
17150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17160 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
17170 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
17180 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17190 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
171a0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
171b0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
171c0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
171d0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
171e0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
171f0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
17200 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
17210 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
17220 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
17230 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
17240 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
17250 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
17260 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
17270 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
17280 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
17290 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
172a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172b0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
172c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172d0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
172e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
17300 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
17310 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
17320 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
17330 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17340 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
17350 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
17360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17370 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
17380 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17390 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
173a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
173b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
173c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
173d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
173e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
173f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
17400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
17410 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
17420 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
17430 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
17440 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
17450 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
17460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17470 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
17480 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
17490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
174a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
174b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
174c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174d0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
174e0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
174f0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
17500 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
17510 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
17520 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
17530 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
17550 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
17560 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17570 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
17580 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
17590 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
175a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
175b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
175c0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
175d0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
175e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
175f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
17600 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
17610 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
17620 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
17630 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
17640 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
17650 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
17660 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
17670 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
17680 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
17690 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
176a0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
176b0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
176c0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
176d0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
176e0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
176f0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
17700 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
17710 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
17720 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
17730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
17740 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17750 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
17760 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
17770 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
17780 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
17790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
177a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
177b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
177c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
177d0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
177e0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
177f0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
17800 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17810 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
17820 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17830 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17840 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17850 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17860 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17870 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17880 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
17890 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
178a0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
178b0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
178c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
178f0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
17900 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17970 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
179e0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17a10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
17a20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17a30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17a40 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
17a50 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17a60 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17a70 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17a80 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
17a90 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
17aa0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
17ab0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
17ac0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
17ad0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17ae0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17af0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17b00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
17b10 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17b20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17b30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17b40 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
17b50 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
17b60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17b70 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
17b80 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
17b90 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
17ba0 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
17bb0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17bc0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17bd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17be0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17bf0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17c00 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
17c10 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17c20 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17c30 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17c40 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17c50 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17c60 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17c70 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17c80 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17c90 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
17cb0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
17cc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17d90 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
17da0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
17db0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
17dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dd0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
17de0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
17df0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
17e00 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
17e10 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
17e20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
17e30 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
17e40 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
17e50 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
17e60 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
17e70 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
17e80 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
17e90 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
17ea0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
17eb0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
17ec0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
17ed0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
17ee0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
17ef0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
17f00 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
17f10 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
17f20 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
17f30 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
17f40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
17f50 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
17f60 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
17f70 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
17f80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
17f90 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
17fa0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
17fb0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
17fc0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
17fd0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
17fe0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
17ff0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
18000 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
18010 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
18020 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
18030 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
18040 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
18050 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
18060 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
18070 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
18080 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
18090 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
180a0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
180b0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
180c0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
180d0 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
180e0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
180f0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18100 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
18110 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
18120 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
18130 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
18140 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
18150 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
18160 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
18170 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
18180 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18190 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
181a0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
181b0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
181c0 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
181d0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
181e0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
181f0 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18200 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18210 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64  o{ got = osPread
18220 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18230 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
18240 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18250 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 53  no==EINTR );.  S
18260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18270 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
18280 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18290 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
182a0 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
182b0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
182c0 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
182d0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
182e0 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c 61  EINTR);.  Simula
182f0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18300 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
18310 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
18320 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
18330 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
18340 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
18350 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
18360 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
18370 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
18380 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
18390 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
183a0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
183b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
183c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
183d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
183e0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
183f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18400 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20  n -1;.  }.  do{ 
18410 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
18420 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20  >h, pBuf, cnt); 
18430 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18440 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
18450 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18460 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18470 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18480 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18490 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
184a0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
184b0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
184c0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
184d0 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
184e0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
184f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18500 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
18510 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
18520 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
18530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
18540 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
18550 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
18560 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
18570 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
18580 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
185a0 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
185b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
185c0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
185d0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
185e0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
185f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18600 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18610 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
18620 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
18630 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
18640 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
18650 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
18660 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
18670 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
18680 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
18690 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
186a0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
186b0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
186c0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
186d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
186e0 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
186f0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
18700 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
18710 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
18720 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
18730 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   .  );.#endif.. 
18740 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
18750 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
18760 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
18770 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
18780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18790 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
187a0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
187b0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
187c0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
187d0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
187e0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
187f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
18800 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18810 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
18820 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
18830 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
18840 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
18850 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
18860 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
18870 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
18880 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
18890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
188a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
188b0 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
188c0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
188d0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
188e0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
188f0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
18900 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
18910 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18920 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
18930 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
18940 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
18950 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
18960 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18970 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
18980 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
18990 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
189a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
189b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
189c0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
189d0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
189e0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
189f0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
18a00 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
18a10 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18a20 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
18a30 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
18a40 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
18a50 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
18a60 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
18a70 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
18a80 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28   got = osPwrite(
18a90 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18aa0 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
18ab0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18ac0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
18ad0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18ae0 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
18af0 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64   = osPwrite64(id
18b00 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18b10 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20  offset);}while( 
18b20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
18b30 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
18b40 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  do{.    newOffse
18b50 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
18b60 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
18b70 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
18b80 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
18b90 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
18ba0 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
18bb0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
18bc0 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
18bd0 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
18be0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18bf0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c10 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18c20 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18c30 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a 20 20  0;....      }.  
18c40 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
18c50 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
18c60 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
18c70 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69  uf, cnt);.  }whi
18c80 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18c90 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
18ca0 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
18cb0 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
18cc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18cd0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18ce0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
18cf0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
18d00 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
18d10 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
18d20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
18d30 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
18d40 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
18d50 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
18d60 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
18d70 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
18d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18d90 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
18da0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18db0 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
18dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18dd0 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
18de0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
18df0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
18e00 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
18e10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
18e20 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
18e30 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18e40 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
18e50 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
18e60 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
18e70 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
18e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
18e90 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
18ea0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
18eb0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
18ec0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
18ed0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
18ee0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
18ef0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
18f00 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
18f10 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
18f20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
18f30 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
18f40 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
18f50 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
18f60 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
18f70 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
18f80 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
18f90 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
18fa0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
18fb0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
18fc0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
18fd0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
18fe0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
18ff0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
19000 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
19010 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
19020 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
19030 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
19040 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
19050 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
19060 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
19070 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
19080 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
19090 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
190a0 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
190b0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
190c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
190d0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
190e0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
190f0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
19100 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
19110 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
19120 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
19130 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
19140 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
19150 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
19160 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
19170 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19180 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
19190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
191a0 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
191b0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
191c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
191d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
191e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
191f0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
19200 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
19210 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
19220 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
19230 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
19240 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
19250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19260 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
19270 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
19280 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19290 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
192a0 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
192b0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
192c0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
192d0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
192e0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
192f0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
19300 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
19310 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
19320 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
19330 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
19340 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
19350 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
19360 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
19370 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
19380 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
19390 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
193a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
193b0 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
193c0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
193d0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
193e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
193f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
19400 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
19410 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
19420 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19430 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19440 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
19460 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
19470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19490 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
194a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
194b0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
194c0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
194d0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
194e0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
194f0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
19500 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
19510 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
19520 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
19530 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
19540 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
19550 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
19560 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
19570 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
19580 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
19590 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
195a0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
195b0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
195c0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
195d0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
195e0 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79 6e  he (slower) fsyn
195f0 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b  c()..** If you k
19600 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
19610 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
19620 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
19630 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
19640 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
19650 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
19660 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69  =fdatasync.*/.#i
19670 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
19680 73 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e 65  sync) && !define
19690 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64  d(__linux__).# d
196a0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
196b0 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
196c0 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
196d0 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
196e0 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
196f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
19700 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
19710 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
19720 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
19730 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
19740 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
19750 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
19760 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
19770 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
19780 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
19790 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
197a0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
197b0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
197c0 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
197d0 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
197e0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
197f0 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
19800 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
19810 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
19820 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
19830 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
19840 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
19850 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
19860 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
19870 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
19880 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
19890 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
198a0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
198b0 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
198c0 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
198d0 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
198e0 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
198f0 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
19900 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
19910 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
19920 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
19930 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
19940 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
19950 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
19960 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
19970 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
19980 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
19990 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
199a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
199b0 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
199c0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
199d0 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
199e0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
199f0 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
19a00 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
19a10 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
19a20 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
19a30 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
19a40 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
19a50 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
19a60 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
19a70 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
19a80 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
19a90 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
19aa0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
19ab0 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
19ac0 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
19ad0 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
19ae0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
19af0 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
19b00 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
19b10 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
19b20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
19b30 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
19b40 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
19b50 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
19b60 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
19b70 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
19b80 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
19b90 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
19ba0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
19bb0 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
19bc0 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
19bd0 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
19be0 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
19bf0 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
19c00 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
19c10 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
19c20 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
19c30 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
19c40 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
19c50 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
19c60 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
19c70 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
19c80 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
19c90 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
19ca0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
19cb0 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
19cc0 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
19cd0 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
19ce0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
19cf0 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
19d00 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
19d10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
19d20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
19d30 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
19d40 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
19d50 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
19d60 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
19d70 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
19d80 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
19d90 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
19da0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
19db0 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
19dc0 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
19dd0 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
19de0 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
19df0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
19e00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19e10 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
19e20 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
19e30 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
19e40 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
19e50 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
19e60 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
19e70 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
19e80 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
19e90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
19ea0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
19eb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
19ec0 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
19ed0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
19ee0 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
19ef0 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
19f00 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
19f10 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
19f20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
19f30 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
19f40 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
19f50 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
19f60 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
19f70 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
19f80 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
19f90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19fa0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
19fb0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
19fc0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
19fd0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
19fe0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
19ff0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
1a000 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
1a010 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
1a020 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
1a030 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
1a040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1a050 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
1a060 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
1a070 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
1a080 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
1a090 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
1a0a0 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
1a0b0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1a0c0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1a0d0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1a0e0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1a0f0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1a100 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1a110 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1a120 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1a130 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1a140 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1a150 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1a160 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1a170 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1a180 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1a190 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1a1a0 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1a1b0 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1a1c0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1a1d0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1a1e0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1a1f0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1a200 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1a210 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1a220 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1a230 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1a240 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1a250 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1a260 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1a270 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1a280 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1a290 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1a2a0 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1a2b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a2c0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1a2d0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1a2e0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1a2f0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1a300 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1a310 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1a320 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1a330 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1a340 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1a350 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1a360 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1a370 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1a380 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1a390 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1a3a0 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1a3b0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1a3c0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1a3d0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1a3e0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1a3f0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1a400 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1a410 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1a420 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1a430 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1a440 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1a450 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1a470 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1a480 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1a490 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1a4a0 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1a4b0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a4c0 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1a4d0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1a4e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1a4f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1a500 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1a510 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1a520 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1a530 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1a540 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1a550 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1a560 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1a570 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1a580 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f  *.** The directo
1a590 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1a5a0 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f  or is used for o
1a5b0 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20  nly one thing - 
1a5c0 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20  to.** fsync() a 
1a5d0 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b  directory to mak
1a5e0 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61  e sure file crea
1a5f0 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f  tion and deletio
1a600 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20  n events.** are 
1a610 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
1a620 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72    Such fsyncs ar
1a630 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  e not needed on 
1a640 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  newer.** journal
1a650 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c  ing filesystems,
1a660 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65   but are require
1a670 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73  d on older files
1a680 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
1a690 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1a6a0 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
1a6b0 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61  ng the xSetSysCa
1a6c0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ll interface..**
1a6d0 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   The ability to 
1a6e0 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f  override this ro
1a6f0 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20  utine was added 
1a700 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68  in support of th
1a710 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61  e.** chromium sa
1a720 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20  ndbox.  Opening 
1a730 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  a directory is a
1a740 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28   security risk (
1a750 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20  we are.** told) 
1a760 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65  so making it ove
1a770 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73  rrideable allows
1a780 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61   the chromium sa
1a790 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c  ndbox to.** repl
1a7a0 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ace this routine
1a7b0 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73   with a harmless
1a7c0 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65   no-op.  To make
1a7d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1a7e0 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63   a no-op, replac
1a7f0 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62  e it with a stub
1a800 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51   that returns SQ
1a810 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1a820 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74  es.** *pFd set t
1a830 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  o a negative num
1a840 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ber..**.** If SQ
1a850 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a860 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1a870 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1a880 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1a890 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1a8a0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1a8b0 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1a8c0 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1a8d0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1a8e0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1a8f0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1a900 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1a910 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1a920 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1a930 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1a940 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1a950 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1a960 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1a970 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1a980 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31  (zDirname); ii>1
1a990 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1a9a0 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1a9b0 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1a9c0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1a9d0 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  \0';.    fd = ro
1a9e0 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1a9f0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1aa00 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
1aa10 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
1aa20 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
1aa30 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
1aa40 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
1aa50 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
1aa60 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
1aa70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1aa80 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25  RACE(("OPENDIR %
1aa90 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
1aaa0 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  Dirname));.    }
1aab0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1aac0 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1aad0 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78  0?SQLITE_OK:unix
1aae0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1aaf0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1ab00 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29  open", zDirname)
1ab10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
1ab20 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
1ab30 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
1ab40 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
1ab50 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
1ab60 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
1ab70 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
1ab80 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
1ab90 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
1aba0 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
1abb0 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
1abc0 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
1abd0 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
1abe0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
1abf0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
1ac00 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
1ac10 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
1ac20 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
1ac30 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1ac40 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
1ac50 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
1ac60 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
1ac70 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
1ac80 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
1ac90 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
1aca0 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
1acb0 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
1acc0 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
1acd0 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
1ace0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
1acf0 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
1ad00 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
1ad10 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
1ad20 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
1ad30 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
1ad40 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
1ad50 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
1ad60 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
1ad70 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1ad80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1ad90 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
1ada0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1adb0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
1adc0 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
1add0 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
1ade0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1adf0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1ae00 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
1ae10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1ae20 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
1ae30 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
1ae40 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1ae50 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
1ae60 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
1ae70 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
1ae80 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
1ae90 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
1aea0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1aeb0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
1aec0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
1aed0 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
1aee0 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
1aef0 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
1af00 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
1af10 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1af20 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
1af30 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1af40 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
1af50 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
1af60 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
1af70 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
1af80 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
1af90 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
1afa0 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
1afb0 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
1afc0 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
1afd0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
1afe0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
1aff0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
1b000 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1b010 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
1b020 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
1b030 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  (("SYNC    %-3d\
1b040 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b050 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
1b060 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
1b070 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
1b080 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
1b090 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1b0a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b0b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1b0c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1b0d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1b0e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1b0f0 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1b100 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1b110 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1b120 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1b130 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1b140 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1b150 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1b160 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1b170 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1b180 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79  ccurrance.  Many
1b190 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1b1a0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1b1b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1b1c0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1b1d0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1b1e0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1b1f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1b200 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1b210 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1b220 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1b230 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1b240 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1b250 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1b260 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1b270 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1b280 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1b290 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1b2a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1b2b0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1b2c0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1b2d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1b2e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72  SQLITE_OK && dir
1b2f0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  fd>=0 ){.      f
1b300 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1b310 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1b320 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1b330 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1b340 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
1b350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1b360 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
1b370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b380 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1b390 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1b3a0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1b3b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b3c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1b3d0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1b3e0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1b3f0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1b400 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1b410 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1b420 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1b430 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b440 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1b450 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1b460 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1b470 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b490 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1b4a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1b4b0 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1b4c0 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1b4d0 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1b4e0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1b4f0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1b500 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1b510 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1b520 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1b530 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1b540 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1b550 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1b560 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1b570 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1b580 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1b590 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1b5a0 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
1b5b0 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1b5c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1b5d0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1b5e0 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1b5f0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1b600 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1b610 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29  File->h, (off_t)
1b620 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
1b630 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1b640 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b650 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1b660 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1b670 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1b680 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1b690 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1b6a0 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
1b6b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
1b6c0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1b6d0 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1b6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1b6f0 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
1b700 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1b710 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1b720 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1b730 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1b740 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
1b750 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1b760 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
1b770 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1b780 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
1b790 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
1b7a0 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
1b7b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1b7c0 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1b7d0 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
1b7e0 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
1b7f0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
1b800 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
1b810 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
1b820 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
1b830 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
1b840 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
1b850 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
1b860 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1b870 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
1b880 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1b890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b8a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1b8b0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1b8c0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1b8d0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1b8e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1b8f0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1b900 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1b910 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1b920 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1b930 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1b940 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1b950 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1b960 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1b970 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b980 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1b990 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  c!=0 ){.    ((un
1b9a0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1b9b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1b9c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b9d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1b9e0 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1b9f0 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1ba00 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1ba10 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1ba20 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1ba30 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1ba40 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1ba50 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1ba60 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1ba70 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1ba80 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1ba90 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1baa0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1bab0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1bac0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1bad0 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1bae0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1baf0 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1bb00 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1bb10 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1bb20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1bb30 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1bb40 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1bb50 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1bb60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb70 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1bb80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1bb90 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1bba0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1bbb0 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1bbc0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1bbd0 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1bbe0 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1bbf0 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1bc00 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1bc10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1bc20 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1bc30 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1bc40 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1bc50 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1bc60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bc70 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1bc80 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1bc90 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1bca0 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1bcb0 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1bcc0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1bcd0 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1bce0 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1bcf0 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1bd00 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1bd10 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1bd20 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1bd30 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1bd40 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1bd50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1bd60 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1bd70 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1bd80 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1bd90 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1bda0 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdc0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1bdd0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1bde0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1bdf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1be00 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1be10 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1be20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1be30 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1be40 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1be50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1be60 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1be70 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1be80 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1be90 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1bea0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1beb0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1bec0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1bed0 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1bee0 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1bef0 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1bf00 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1bf10 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1bf20 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1bf30 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1bf40 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1bf50 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1bf60 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1bf70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1bf80 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1bf90 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1bfa0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1bfb0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1bfc0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1bfd0 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1bfe0 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1bff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1c000 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1c010 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1c020 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1c030 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1c040 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1c050 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1c060 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1c070 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1c080 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c090 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1c0a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1c0b0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1c0c0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1c0d0 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1c0e0 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1c0f0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1c100 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1c110 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1c120 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1c130 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1c140 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1c150 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1c160 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1c170 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1c180 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1c190 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1c1a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1c1b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1c1c0 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1c1d0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1c1e0 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1c1f0 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1c200 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1c210 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1c220 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1c230 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1c240 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1c250 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c270 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1c280 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1c290 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1c2a0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1c2b0 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1c2c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c2d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1c2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1c2f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1c300 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1c310 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1c320 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1c330 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1c340 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1c350 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1c360 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1c370 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1c380 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1c390 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1c3a0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1c3b0 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1c3c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1c3d0 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1c3e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c3f0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1c400 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1c410 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1c420 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1c430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c440 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1c450 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1c460 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1c470 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1c480 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1c490 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1c4a0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1c4b0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1c4c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1c4d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1c4e0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1c4f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1c500 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1c510 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1c520 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1c530 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1c540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c550 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1c560 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1c570 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1c580 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  pArg = pFile->la
1c590 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1c5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c5b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c5c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1c5d0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1c5e0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1c5f0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1c600 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c620 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1c630 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1c640 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1c650 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1c660 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1c670 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53       rc = fcntlS
1c680 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
1c690 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
1c6a0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c6b0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1c6c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c6d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1c6e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1c6f0 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1c700 69 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a  int bPersist = *
1c710 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
1c720 20 20 69 66 28 20 62 50 65 72 73 69 73 74 3c 30    if( bPersist<0
1c730 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e   ){.        *(in
1c740 74 2a 29 70 41 72 67 20 3d 20 28 70 46 69 6c 65  t*)pArg = (pFile
1c750 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1c760 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
1c770 41 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65  AL)!=0;.      }e
1c780 6c 73 65 20 69 66 28 20 62 50 65 72 73 69 73 74  lse if( bPersist
1c790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1c7a0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1c7b0 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52  &= ~UNIXFILE_PER
1c7c0 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20  SIST_WAL;.      
1c7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c7e0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1c7f0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  |= UNIXFILE_PERS
1c800 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d  IST_WAL;.      }
1c810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1c830 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1c840 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1c850 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1c860 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1c870 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1c880 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1c890 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1c8a0 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1c8b0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1c8c0 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1c8d0 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1c8e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1c8f0 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1c900 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1c910 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1c920 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1c930 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1c940 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1c950 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1c960 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1c970 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c980 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1c990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1c9a0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1c9b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1c9c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c9d0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1c9e0 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1c9f0 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1ca00 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1ca10 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1ca20 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1ca30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1ca40 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1ca50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1ca60 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1ca70 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65  E__) */.    case
1ca80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
1ca90 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20  NC_OMITTED: {.  
1caa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cab0 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f  E_OK;  /* A no-o
1cac0 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p */.    }.  }. 
1cad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1cae0 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
1caf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1cb00 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
1cb10 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
1cb20 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
1cb30 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
1cb40 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
1cb50 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
1cb60 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
1cb70 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
1cb80 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
1cb90 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
1cba0 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
1cbb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
1cbc0 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
1cbd0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
1cbe0 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
1cbf0 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
1cc00 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
1cc10 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
1cc20 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
1cc30 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
1cc40 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
1cc50 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1cc60 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
1cc70 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
1cc80 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1cc90 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1cca0 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1ccb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ccc0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1ccd0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1cce0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1ccf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cd00 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1cd10 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
1cd20 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
1cd30 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e   always 0 for un
1cd40 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ix..*/.static in
1cd50 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
1cd60 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1cd70 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1cd80 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1cd90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1cda0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1cdb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cdc0 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20  MIT_WAL.../*.** 
1cdd0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
1cde0 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
1cdf0 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
1ce00 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
1ce10 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
1ce20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
1ce30 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
1ce40 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
1ce50 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
1ce60 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
1ce70 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
1ce80 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
1ce90 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
1cea0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1ceb0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
1cec0 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
1ced0 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
1cee0 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
1cef0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
1cf00 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
1cf10 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
1cf20 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
1cf30 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
1cf40 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
1cf50 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
1cf60 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
1cf70 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
1cf80 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
1cf90 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
1cfa0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
1cfb0 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
1cfc0 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
1cfd0 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
1cfe0 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
1cff0 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
1d000 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
1d010 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
1d020 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
1d030 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
1d040 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1d050 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
1d060 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
1d070 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
1d080 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1d090 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
1d0a0 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
1d0b0 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
1d0c0 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
1d0d0 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
1d0e0 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
1d0f0 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
1d100 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
1d110 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1d120 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
1d130 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
1d140 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1d150 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
1d160 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
1d170 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
1d180 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
1d190 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
1d1a0 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
1d1b0 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
1d1c0 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
1d1d0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
1d1e0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
1d1f0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
1d200 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1d210 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
1d220 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
1d230 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1d240 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1d250 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
1d260 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
1d270 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
1d280 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
1d290 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
1d2a0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1d2b0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
1d2c0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
1d2d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
1d2e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
1d2f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1d300 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
1d310 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
1d340 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1d350 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
1d360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d370 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
1d380 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
1d390 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d3b0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
1d3c0 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
1d3d0 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
1d3e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d3f0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1d400 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
1d410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1d420 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
1d430 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1d440 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1d450 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1d460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d470 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
1d480 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1d490 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
1d4a0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1d4b0 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
1d4c0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1d4d0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
1d4e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d4f0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d510 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1d520 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1d530 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
1d540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d550 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1d560 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1d570 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
1d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1d590 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
1d5a0 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
1d5b0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1d5c0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1d5d0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1d5e0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1d5f0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1d600 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1d610 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1d620 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
1d630 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1d640 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
1d650 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
1d660 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
1d670 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
1d680 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
1d690 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
1d6a0 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
1d6b0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
1d6c0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
1d6d0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
1d6e0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
1d6f0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1d700 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
1d710 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
1d720 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
1d730 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
1d740 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1d750 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
1d760 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
1d770 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1d780 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
1d790 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1d7a0 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
1d7b0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1d7c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1d7d0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d7f0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
1d800 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
1d810 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1d820 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1d830 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1d840 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1d850 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1d860 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1d880 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1d890 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
1d8a0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
1d8b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8c0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1d8d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1d8e0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
1d8f0 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
1d900 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
1d910 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
1d920 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
1d930 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
1d940 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
1d950 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
1d960 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1d970 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1d980 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
1d990 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
1d9a0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1d9b0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
1d9c0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
1d9d0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
1d9e0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1d9f0 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
1da00 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
1da10 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
1da20 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
1da30 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
1da40 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
1da50 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
1da60 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1da70 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
1da80 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
1da90 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1daa0 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
1dab0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
1dac0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1dad0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
1dae0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
1daf0 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
1db00 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
1db10 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db30 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
1db40 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1db50 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db70 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1db80 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
1db90 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
1dba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
1dbb0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
1dbc0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
1dbd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dbe0 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
1dbf0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
1dc00 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
1dc10 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
1dc20 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1dc30 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1dc40 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1dc50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1dc60 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
1dc70 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
1dc80 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1dc90 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
1dca0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
1dcb0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
1dcc0 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
1dcd0 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
1dce0 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
1dcf0 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
1dd00 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
1dd10 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
1dd20 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
1dd30 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
1dd40 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
1dd50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1dd60 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1dd70 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1dd80 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
1dd90 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
1dda0 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
1ddb0 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
1ddc0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
1ddd0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
1dde0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
1ddf0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
1de00 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
1de10 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
1de20 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
1de30 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
1de40 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
1de50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
1de60 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
1de70 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
1de80 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
1de90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1dea0 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
1deb0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1dec0 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
1ded0 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
1dee0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
1def0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1df00 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
1df10 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
1df20 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1df30 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
1df40 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1df50 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1df60 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1df70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1df80 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1df90 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1dfa0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
1dfb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1dfc0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
1dfd0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
1dfe0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1dff0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1e000 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
1e010 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
1e020 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
1e030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e040 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
1e050 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
1e060 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
1e070 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
1e080 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e090 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1e0a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e0b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1e0c0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
1e0d0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
1e0e0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
1e0f0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1e100 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
1e110 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
1e120 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
1e130 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
1e140 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e150 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
1e160 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
1e170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
1e180 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
1e190 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
1e1a0 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
1e1b0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
1e1c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
1e1d0 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
1e1e0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
1e1f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e200 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1e210 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
1e220 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
1e230 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1e240 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
1e250 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1e260 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
1e270 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1e280 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
1e290 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
1e2a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
1e2b0 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
1e2c0 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
1e2d0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
1e2e0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
1e2f0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
1e300 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
1e310 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e320 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
1e330 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
1e340 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
1e350 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1e360 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
1e370 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
1e380 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
1e390 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
1e3a0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1e3b0 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
1e3c0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
1e3d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1e3e0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
1e3f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1e400 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
1e410 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
1e420 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61  ){.        munma
1e430 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  p(p->apRegion[i]
1e440 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a  , p->szRegion);.
1e450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1e470 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  e(p->apRegion[i]
1e480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e4a0 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a  e(p->apRegion);.
1e4b0 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
1e4c0 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
1e4d0 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c  close(pFd, p->h,
1e4e0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1e4f0 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20    p->h = -1;.   
1e500 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65   }.    p->pInode
1e510 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a  ->pShmNode = 0;.
1e520 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e530 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
1e540 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
1e550 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
1e560 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
1e570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1e580 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
1e590 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
1e5a0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
1e5b0 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
1e5c0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
1e5d0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1e5e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
1e5f0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
1e600 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
1e610 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1e620 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
1e630 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
1e640 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
1e650 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
1e660 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
1e670 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
1e680 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
1e690 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
1e6a0 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
1e6b0 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
1e6c0 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
1e6d0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
1e6e0 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
1e6f0 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
1e700 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
1e710 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
1e720 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
1e730 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
1e740 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
1e750 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
1e760 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
1e770 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
1e780 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
1e790 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
1e7a0 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
1e7b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e7c0 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
1e7d0 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
1e7e0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
1e7f0 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
1e800 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
1e810 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
1e820 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
1e830 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
1e840 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
1e850 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
1e860 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1e870 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
1e880 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
1e890 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
1e8a0 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
1e8b0 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
1e8c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e8d0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
1e8e0 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
1e8f0 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
1e900 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
1e910 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
1e920 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
1e930 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
1e940 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
1e950 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
1e960 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
1e970 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
1e980 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
1e990 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
1e9a0 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
1e9b0 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
1e9c0 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
1e9d0 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
1e9e0 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
1e9f0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
1ea00 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
1ea10 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
1ea20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1ea30 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
1ea40 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1ea50 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
1ea60 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
1ea70 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1ea80 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
1ea90 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
1eaa0 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
1eab0 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
1eac0 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
1ead0 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
1eae0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
1eaf0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1eb00 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1eb10 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1eb20 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1eb30 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1eb40 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1eb50 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1eb60 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1eb70 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1eb80 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1eb90 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1eba0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1ebb0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1ebc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
1ebd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1ebe0 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
1ebf0 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
1ec00 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
1ec10 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
1ec20 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1ec30 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1ec40 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
1ec50 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
1ec60 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
1ec70 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
1ec80 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
1ec90 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
1eca0 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
1ecb0 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
1ecc0 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
1ecd0 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
1ece0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
1ecf0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
1ed00 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
1ed10 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
1ed20 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
1ed30 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
1ed40 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
1ed50 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
1ed60 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
1ed70 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1ed80 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1ed90 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
1eda0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
1edb0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1edc0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1edd0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
1ede0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1ee10 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
1ee20 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ee30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ee40 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
1ee50 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e   char *zShmFilen
1ee60 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1ee70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1ee80 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48  file used for SH
1ee90 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46  M */.  int nShmF
1eea0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1eeb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1eec0 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61  f the SHM filena
1eed0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1eee0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1eef0 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1ef00 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20  unixShm object. 
1ef10 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
1ef20 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1ef30 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1ef40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1ef50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
1ef60 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
1ef70 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p));.  assert( p
1ef80 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
1ef90 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1efa0 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d  see if a unixShm
1efb0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65  Node object alre
1efc0 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73  ady exists. Reus
1efd0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  e an existing.  
1efe0 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e  ** one if presen
1eff0 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  t. Create a new 
1f000 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
1f010 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
1f020 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
1f030 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1f040 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  ode;.  pShmNode 
1f050 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  = pInode->pShmNo
1f060 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  de;.  if( pShmNo
1f070 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  de==0 ){.    str
1f080 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20  /* fstat() info 
1f0b0 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
1f0c0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  e */..    /* Cal
1f0d0 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67  l fstat() to fig
1f0e0 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d  ure out the perm
1f0f0 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64  issions on the d
1f100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1f110 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d  .    ** a new *-
1f120 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61  shm file is crea
1f130 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ted, an attempt 
1f140 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1f150 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  create it.    **
1f160 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
1f170 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65 20  ermissions. The 
1f180 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73 69 6f  actual permissio
1f190 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ns the file is c
1f1a0 72 65 61 74 65 64 0a 20 20 20 20 2a 2a 20 77 69  reated.    ** wi
1f1b0 74 68 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  th are subject t
1f1c0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 6d  o the current um
1f1d0 61 73 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  ask setting..   
1f1e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
1f1f0 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
1f200 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d  Stat) && pInode-
1f210 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1f220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f230 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f240 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1f250 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1f260 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f270 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
1f280 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1f290 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
1f2a0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
1f2b0 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   30;.#else.    n
1f2c0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20  ShmFilename = 5 
1f2d0 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44  + (int)strlen(pD
1f2e0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  bFd->zPath);.#en
1f2f0 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
1f300 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1f310 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
1f320 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
1f330 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
1f340 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
1f350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f360 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1f370 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1f380 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1f390 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
1f3a0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
1f3b0 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
1f3c0 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
1f3d0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1f3e0 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
1f3f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1f400 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1f410 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f420 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1f430 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
1f460 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
1f470 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
1f4a0 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
1f4b0 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
1f4c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f4d0 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
1f4e0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
1f4f0 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1f500 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
1f510 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1f520 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53  pDbFd->zPath, zS
1f530 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  hmFilename);.#en
1f540 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
1f550 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44  ->h = -1;.    pD
1f560 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1f570 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1f580 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1f590 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
1f5a0 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  pInode;.    pShm
1f5b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
1f5c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1f5d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1f5e0 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
1f5f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
1f600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f610 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f620 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1f630 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1f640 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
1f650 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1f660 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1f670 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
1f680 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  zShmFilename, O_
1f690 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20  RDWR|O_CREAT,.  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 53               (sS
1f6c0 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37  tat.st_mode & 07
1f6d0 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
1f6e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
1f6f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1f700 68 61 72 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20  har *zRO;.      
1f710 20 20 7a 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f    zRO = sqlite3_
1f720 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 70 44  uri_parameter(pD
1f730 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61  bFd->zPath, "rea
1f740 64 6f 6e 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20  donly_shm");.   
1f750 20 20 20 20 20 69 66 28 20 7a 52 4f 20 26 26 20       if( zRO && 
1f760 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
1f770 6e 28 7a 52 4f 29 20 29 7b 0a 20 20 20 20 20 20  n(zRO) ){.      
1f780 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1f790 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
1f7a0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  hmFilename, O_RD
1f7b0 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20  ONLY,.          
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74            (sStat
1f7e0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
1f7f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 68  );.          pSh
1f800 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
1f810 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  y = 1;.        }
1f820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68  .        if( pSh
1f830 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
1f840 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1f850 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1f860 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
1f870 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65  "open", zShmFile
1f880 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1f890 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1f8a0 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
1f8b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
1f8c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1f8d0 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
1f8e0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1f8f0 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
1f900 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ..      ** If no
1f910 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
1f920 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1f930 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  gth. .      */. 
1f940 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f950 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75  _OK;.      if( u
1f960 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1f970 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
1f980 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
1f990 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 1)==SQLITE_OK 
1f9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1f9b0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1f9c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20  pShmNode->h, 0) 
1f9d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1f9e0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1f9f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1fa00 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22  PEN, "ftruncate"
1fa10 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1fa20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fa30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1fa40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fa50 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
1fa60 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1fa70 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
1fa80 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
1fa90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1faa0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1fab0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1fac0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
1fad0 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1fae0 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1faf0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
1fb00 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
1fb10 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
1fb20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1fb30 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
1fb40 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
1fb50 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
1fb60 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
1fb70 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
1fb80 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1fb90 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
1fba0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
1fbb0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
1fbc0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
1fbd0 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
1fbe0 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
1fbf0 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
1fc00 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
1fc10 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
1fc20 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
1fc30 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
1fc40 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
1fc50 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
1fc60 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
1fc70 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
1fc80 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
1fc90 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
1fca0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
1fcb0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
1fcc0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
1fcd0 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
1fce0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
1fcf0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
1fd00 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
1fd10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1fd20 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1fd30 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
1fd40 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
1fd50 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
1fd60 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
1fd70 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
1fd80 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1fd90 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1fda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fdb0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1fdc0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1fdd0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1fde0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
1fdf0 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
1fe00 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1fe10 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1fe20 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1fe30 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
1fe40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
1fe50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fe60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe70 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
1fe80 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
1fe90 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
1fea0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
1feb0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
1fec0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
1fed0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
1fee0 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
1fef0 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
1ff00 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1ff10 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1ff20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1ff30 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1ff40 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
1ff50 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1ff60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1ff70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ff80 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1ff90 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1ffa0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1ffb0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
1ffc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1ffd0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1ffe0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1fff0 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
20000 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
20010 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
20020 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
20030 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
20040 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
20050 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
20060 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
20070 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20080 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
20090 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
200a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
200b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
200c0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
200d0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
200e0 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
200f0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
20100 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
20110 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
20120 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
20130 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
20140 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
20150 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
20160 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
20170 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
20180 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
20190 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
201a0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
201b0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
201c0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
201d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
201e0 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
201f0 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
20200 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
20210 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
20220 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
20230 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
20240 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
20250 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
20260 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
20270 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
20280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20290 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
202a0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
202b0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
202c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
202d0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
202e0 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20300 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
20310 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
20320 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
20330 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
20340 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
20350 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
20360 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
20370 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
20380 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
20390 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
203a0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
203b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
203c0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  OK;..  /* If the
203d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
203e0 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
203f0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
20400 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
20410 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
20420 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
20430 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
20440 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
20450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20470 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
20480 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
20490 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
204a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
204b0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
204c0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
204d0 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
204e0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
204f0 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
20500 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
20510 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
20520 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
20530 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
20540 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20550 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
20560 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20570 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
20580 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
20590 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
205a0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
205b0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
205c0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
205d0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
205e0 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20600 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
20610 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
20620 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
20630 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
20640 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
20650 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
20660 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
20670 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
20680 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
20690 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
206a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
206b0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
206c0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
206d0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
206e0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
206f0 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
20700 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
20710 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
20720 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
20730 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
20740 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
20750 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
20760 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
20770 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
20780 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
20790 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
207a0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
207b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
207c0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
207d0 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
207e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
207f0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
20800 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
20810 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
20820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
20830 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
20840 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
20850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
20860 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
20870 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
20880 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
20890 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
208a0 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
208b0 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
208c0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
208d0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
208e0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
208f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c  **.        ** Al
20900 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
20910 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
20920 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
20930 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
20940 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
20950 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
20960 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
20970 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
20980 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70  tend ) goto shmp
20990 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
209a0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
209b0 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
209c0 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  h, nByte) ){.   
209d0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
209e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
209f0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
20a00 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20 20  ftruncate",.    
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
20a30 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
20a40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
20a50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
20a60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20a70 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
20a80 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
20a90 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
20aa0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
20ab0 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
20ac0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61      apNew = (cha
20ad0 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  r **)sqlite3_rea
20ae0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
20af0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
20b00 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
20b10 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
20b20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
20b30 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
20b40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20b50 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
20b60 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
20b70 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
20b80 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
20b90 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68  w;.    while(pSh
20ba0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
20bb0 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20  iRegion){.      
20bc0 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
20bd0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
20be0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
20bf0 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73  pMem = mmap(0, s
20c00 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  zRegion,.       
20c10 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
20c20 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
20c30 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
20c40 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
20c50 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
20c60 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
20c70 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  >h, pShmNode->nR
20c80 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20  egion*szRegion. 
20c90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20ca0 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
20cb0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
20cc0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
20cd0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20ce0 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
20cf0 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
20d00 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
20d10 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
20d20 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
20d30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20d40 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
20d50 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69  e3_malloc(szRegi
20d60 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  on);.        if(
20d70 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
20d80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20d90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
20da0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
20db0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
20dc0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d         memset(pM
20dd0 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  em, 0, szRegion)
20de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20df0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
20e00 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
20e10 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20  gion] = pMem;.  
20e20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
20e30 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
20e40 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
20e50 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20e60 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
20e70 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
20e80 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
20e90 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
20ea0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
20eb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
20ec0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
20ed0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20ee0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
20ef0 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
20f00 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
20f10 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
20f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20f30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
20f40 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
20f50 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
20f60 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
20f70 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
20f80 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
20f90 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
20fa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
20fb0 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
20fc0 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
20fd0 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
20fe0 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
20ff0 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
21000 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
21010 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
21020 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
21030 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
21040 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
21050 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
21060 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
21070 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
21080 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
21090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
210a0 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
210b0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
210c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
210d0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
210e0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
210f0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
21120 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
21130 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
21140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21150 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21160 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
21170 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
21180 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
211a0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
211b0 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
211c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
211d0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
211e0 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
211f0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
21200 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
21210 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
21220 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
21230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
21240 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
21250 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
21260 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
21290 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
212a0 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
212b0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
212c0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
212d0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
212e0 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
212f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21300 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
21310 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
21320 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
21330 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
21360 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
21370 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
21380 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
21390 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
213a0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
213b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
213c0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
213d0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
213e0 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
213f0 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
21400 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
21410 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
21420 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
21430 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
21440 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
21450 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
21460 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
21470 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
21480 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
21490 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
214a0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
214b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
214c0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
214d0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
214e0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
214f0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
21500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
21510 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
21520 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
21530 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
21540 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
21550 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
21560 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
21570 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
21580 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
21590 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
215a0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
215b0 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
215c0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
215d0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
215e0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
215f0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
21600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
21610 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
21620 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
21630 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
21640 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
21650 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
21660 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
21670 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
21680 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
21690 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
216a0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
216b0 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
216c0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
216d0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
216e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
216f0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
21700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21710 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
21720 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
21730 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
21740 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
21750 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
21760 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
21770 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
21780 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
21790 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
217a0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
217b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
217c0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
217d0 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
217e0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
217f0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
21800 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21820 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
21830 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
21840 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21860 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
21870 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
21880 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
21890 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
218a0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
218b0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
218c0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
218d0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
218e0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
218f0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
21900 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
21910 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
21920 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
21930 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
21940 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
21950 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
21960 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
21970 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
21980 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
21990 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
219a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
219b0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
219c0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
219d0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
219e0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
219f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21a00 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21a10 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
21a20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21a30 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
21a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21a50 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
21a60 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
21a70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
21a80 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
21a90 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
21aa0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
21ab0 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
21ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21ad0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
21ae0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
21af0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
21b00 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21b10 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
21b20 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
21b30 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
21b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21b70 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
21b80 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
21b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
21ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21bb0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
21bc0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
21bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
21be0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
21bf0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
21c00 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
21c10 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
21c20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
21c30 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
21c40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
21c50 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
21c60 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
21c70 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
21c80 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
21c90 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
21ca0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
21cb0 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
21cc0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
21cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21ce0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21cf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
21d10 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
21d20 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
21d30 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
21d40 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
21d50 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
21d60 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
21d70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
21d80 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
21d90 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
21da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21db0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
21dc0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
21dd0 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
21de0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
21df0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
21e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21e20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
21e30 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
21e40 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
21e50 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
21e60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
21e70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
21e80 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
21e90 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
21ea0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
21eb0 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
21ec0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
21ed0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
21ee0 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
21ef0 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
21f00 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
21f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
21f20 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
21f30 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
21f40 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
21f50 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
21f60 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
21f70 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
21f80 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
21f90 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
21fa0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
21fb0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
21fc0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
21fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21fe0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
21ff0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
22000 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
22010 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
22020 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
22030 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
22040 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
22050 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
22060 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
22070 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
22080 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
22090 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
220a0 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
220b0 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
220c0 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
220d0 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
220e0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
220f0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
22100 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
22110 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22120 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
22130 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
22140 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
22150 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
22160 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
22170 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
22180 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
22190 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
221a0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
221b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
221c0 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
221d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
221e0 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
221f0 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
22200 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
22230 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
22240 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
22250 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
22260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
22270 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
22280 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
22290 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
222c0 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
222d0 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
222e0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22300 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
22320 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
22330 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
22340 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
22350 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
22360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
22370 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
22380 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
22390 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
223a0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
223b0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
223c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
223d0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
223e0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
223f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
22400 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
22410 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
22420 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
22430 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
22440 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
22450 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
22460 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
22470 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
22480 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
22490 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
224a0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
224b0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
224c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
224d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
224e0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
224f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
22500 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
22510 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
22520 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
22530 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
22540 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
22550 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
22560 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
22570 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
22580 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
22590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
225a0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
225b0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
225c0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
225d0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
225e0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
225f0 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
22600 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28  h>=0 ) osUnlink(
22610 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
22620 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
22630 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
22640 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
22650 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
22660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
22670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
22680 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
22690 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
226a0 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
226b0 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
226c0 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
226d0 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
226e0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
226f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
22700 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  */../*.** Here e
22710 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
22720 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
22730 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
22740 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
22750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
22760 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
22770 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22790 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
227a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227e0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
227f0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
22800 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
22810 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
22820 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
22830 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
22840 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
22850 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
22860 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
22870 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
22880 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
22890 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
228a0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
228b0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
228c0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
228d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
228e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
228f0 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
22900 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
22910 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
22920 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
22930 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
22940 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
22950 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
22960 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
22970 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
22980 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
22990 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
229a0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
229b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
229c0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
229d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
229e0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
229f0 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
22a00 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
22a10 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
22a20 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
22a30 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
22a40 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
22a50 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
22a60 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
22a70 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
22a80 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
22a90 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
22aa0 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
22ab0 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
22ac0 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
22ad0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
22ae0 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
22af0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
22b00 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
22b10 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
22b20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
22b30 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
22b40 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
22b50 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
22b60 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
22b70 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
22b80 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
22b90 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
22ba0 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
22bb0 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
22bc0 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
22bd0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
22be0 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
22bf0 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
22c00 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
22c10 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
22c20 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
22c30 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
22c40 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
22c50 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
22c60 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
22c70 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
22c80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22c90 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
22ca0 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
22cb0 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
22cc0 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
22cd0 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
22ce0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
22cf0 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
22d00 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
22d10 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
22d20 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
22d30 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
22d40 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
22d50 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
22d60 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
22d70 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
22d80 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
22d90 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
22da0 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
22db0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
22dc0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
22dd0 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
22e30 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22f40 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
22f50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22f60 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
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 20 20 5c 0a                \.
22f90 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22fb0 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22fe0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23000 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23030 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23050 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23080 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
23090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
230a0 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
230d0 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
230e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
230f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23100 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23110 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
23120 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
23130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
23140 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23170 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
23180 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
23190 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
231c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
231d0 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
231e0 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
231f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23200 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
23210 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
23220 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
23230 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
23260 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
23270 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
23280 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232a0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
232b0 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
232c0 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
232d0 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232f0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
23300 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
23310 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
23320 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
233a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
233b0 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
233c0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
233d0 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
233e0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
233f0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
23400 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23430 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
23440 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23480 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
234d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
234e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
234f0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
23500 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
23510 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
23520 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
23530 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
23540 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
23550 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23560 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
23570 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
23580 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
23590 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
235a0 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
235b0 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
235c0 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
235d0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
235e0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
235f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
23600 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23610 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
23620 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
23630 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
23640 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23650 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23680 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
23690 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
236a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
236b0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
236c0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
236d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
236e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
236f0 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
23700 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23710 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
23720 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
23730 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23740 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
23750 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
23760 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
23770 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
23780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23790 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
237a0 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
237b0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
237c0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
237d0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
237e0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
23810 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
23820 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
23830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23840 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
23850 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23870 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
23880 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
23890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
238a0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
238b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
238c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f  ReservedLock   /
238d0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
238e0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
238f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
23900 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
23910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
23920 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
23930 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
23940 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
23950 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
23960 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
23970 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
239a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
239b0 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
239c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
239d0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
239e0 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
239f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23a00 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
23a10 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
23a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
23a30 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
23a40 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
23a50 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78  servedLock  /* x
23a60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23a70 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23  k method */.)..#
23a80 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
23a90 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
23aa0 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  & !OS_VXWORKS.IO
23ab0 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
23ac0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
23ad0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23ae0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23af0 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
23b00 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
23b10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23b20 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23b30 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b50 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
23b60 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
23b70 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
23b80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23b90 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
23ba0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
23bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23bc0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
23bd0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
23be0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23bf0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
23c00 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
23c10 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
23c20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23c30 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23c40 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
23c50 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
23c60 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
23c70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
23c80 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23c90 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
23ca0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
23cb0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23cc0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
23cd0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
23d00 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
23d10 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20  .  semClose,    
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d30 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23d40 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20  .  semLock,     
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d60 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
23d70 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20    semUnlock,    
23d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23d90 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23da0 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  .  semCheckReser
23db0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
23dc0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23dd0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
23de0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
23df0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
23e00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23e10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
23e20 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
23e30 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
23e40 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23e50 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23e60 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
23e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23e80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23e90 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23ea0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23ec0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23ed0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
23ee0 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
23ef0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23f00 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
23f10 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
23f20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
23f30 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
23f40 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
23f50 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23f60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
23f70 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
23f80 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
23f90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
23fa0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
23fb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
23fc0 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
23fd0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
23fe0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
23ff0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
24000 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
24010 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
24020 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
24030 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
24040 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
24050 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
24060 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
24070 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
24080 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
24090 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
240a0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
240b0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
240c0 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
240d0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
240e0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
240f0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
24100 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
24110 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
24120 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
24130 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24140 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
24150 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
24160 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
24170 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
24180 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
24190 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
241a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
241b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
241c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
241d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
241e0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
241f0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
24200 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
24210 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
24220 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
24230 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
24240 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
24250 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
24260 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
24270 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
24280 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
24290 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
242a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
242b0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
242c0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
242d0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
242e0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
242f0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
24300 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
24330 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
24340 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
24350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24360 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
24370 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
243a0 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
243b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
243c0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
243d0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
243e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
243f0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
24400 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
24410 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73  ).#endif../* nfs
24420 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30   lockd on OSX 10
24430 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61  .3+ doesn't clea
24440 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68  r write locks wh
24450 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
24460 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66  s set */.#if def
24470 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24480 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24490 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
244a0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49  OMETHODS(.  nfsI
244b0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
244c0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
244d0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
244e0 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73  /.  nfsIoMethods
244f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24500 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
24510 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
24520 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
24550 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
24560 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24580 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
24590 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245b0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
245c0 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245e0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
245f0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
24600 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
24610 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24620 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
24630 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
24640 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24650 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
24660 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24670 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
24680 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
24690 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
246a0 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
246b0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
246c0 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
246d0 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
246e0 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
246f0 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
24700 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
24710 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
24720 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
24730 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
24740 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f   is for MacOSX o
24750 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
24760 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
24770 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
24780 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
24790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
247a0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
247b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
247c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
247d0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
247e0 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c       /* open fil
247f0 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
24800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24810 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
24820 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
24830 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
24840 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
24850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24860 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
24870 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
24880 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
24890 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
248a0 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
248b0 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
248c0 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
248d0 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
248e0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
248f0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
24900 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
24910 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
24920 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
24930 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
24940 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
24950 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24960 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
24970 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
24980 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
24990 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
249a0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
249b0 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
249c0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
249d0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
249e0 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
249f0 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
24a00 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
24a10 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
24a20 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
24a30 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
24a40 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
24a50 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
24a60 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
24a70 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
24a80 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
24a90 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
24aa0 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
24ab0 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
24ac0 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
24ad0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
24ae0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
24af0 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
24b00 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
24b10 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
24b20 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
24b30 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
24b40 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
24b50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
24b60 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
24b70 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
24b80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
24b90 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
24ba0 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
24bb0 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
24bc0 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
24bd0 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
24be0 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
24bf0 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
24c00 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
24c10 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
24c20 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
24c30 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
24c40 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
24c50 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
24c60 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
24c70 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
24c80 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24c90 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
24ca0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
24cb0 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
24cc0 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
24cd0 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  o)!=-1 ) {.    i
24ce0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
24cf0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
24d00 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfs")==0 ){.    
24d10 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d    return &nfsIoM
24d20 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c  ethods;.    } el
24d30 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
24d40 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
24d50 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
24d60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f  {.    return &do
24d70 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  tlockIoMethods;.
24d80 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
24d90 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
24da0 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
24db0 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
24dc0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
24dd0 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
24de0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
24df0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  l;..#endif /* de
24e00 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24e10 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
24e20 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
24e30 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  */..#if OS_VXWOR
24e40 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
24e50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24e60 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
24e70 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
24e80 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
24e90 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
24ea0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
24eb0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
24ec0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
24ed0 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
24ee0 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
24ef0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
24f00 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
24f10 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
24f20 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
24f30 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73  s is for VXWorks
24f40 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
24f50 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
24f60 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
24f70 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
24f80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
24f90 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
24fa0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
24fb0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
24fc0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
24fd0 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
24fe0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
24ff0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
25000 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
25010 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
25020 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
25030 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
25040 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
25050 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
25060 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
25070 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
25080 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
25090 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
250a0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
250b0 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
250c0 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
250d0 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
250e0 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
250f0 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
25100 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
25110 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
25120 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
25130 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
25140 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
25150 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
25160 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
25170 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
25180 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
25190 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
251a0 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
251b0 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
251c0 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
251d0 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
251e0 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
251f0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
25200 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
25210 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
25220 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
25230 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
25240 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
25250 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
25260 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
25270 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
25280 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  ;..#endif /* OS_
25290 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
252a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
252b0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
252c0 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70   An abstract typ
252d0 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  e for a pointer 
252e0 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66  to a IO method f
252f0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
25300 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
25310 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
25320 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
25330 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
25340 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
25350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
253a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253b0 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
253c0 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
253d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
253f0 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
25400 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
25410 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
25420 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
25430 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
25440 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
25450 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
25460 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
25470 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
25480 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
25490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
254a0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
254b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
254c0 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
254d0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
254e0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
25510 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
25520 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
25530 20 20 69 6e 74 20 73 79 6e 63 44 69 72 2c 20 20    int syncDir,  
25540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25550 65 20 74 6f 20 73 79 6e 63 20 64 69 72 65 63 74  e to sync direct
25560 6f 72 79 20 6f 6e 20 66 69 72 73 74 20 73 79 6e  ory on first syn
25570 63 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  c */.  sqlite3_f
25580 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
25590 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
255a0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
255b0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
255c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
255d0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
255e0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
255f0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
25600 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
25610 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
25620 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
25630 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20  nt isDelete,    
25640 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
25650 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
25660 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61  e */.  int isRea
25670 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f  dOnly          /
25680 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66 69  * True if the fi
25690 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
256a0 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63  d-only */.){.  c
256b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
256c0 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
256d0 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
256e0 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
256f0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
25700 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25710 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
25720 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
25730 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
25740 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
25750 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
25760 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69  rks. Express thi
25770 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20  s explicitly .  
25780 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ** here to preve
25790 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
257a0 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
257b0 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
257c0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
257d0 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
257e0 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
257f0 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
25800 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
25810 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
25820 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
25830 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
25840 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
25850 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
25860 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
25870 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
25880 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
25890 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
258a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
258b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
258c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
258d0 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
258e0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
258f0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
25900 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
25910 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
25920 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
25930 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
25940 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
25950 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
25960 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
25970 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
25980 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
25990 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
259a0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
259b0 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74   h;.  pNew->zPat
259c0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
259d0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56 66 73   if( memcmp(pVfs
259e0 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
259f0 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20  cl",10)==0 ){.  
25a00 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
25a10 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s = UNIXFILE_EXC
25a20 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
25a30 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
25a40 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
25a50 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  sReadOnly ){.   
25a60 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
25a70 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
25a80 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
25a90 79 6e 63 44 69 72 20 29 7b 0a 20 20 20 20 70 4e  yncDir ){.    pN
25aa0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
25ab0 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
25ac0 43 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  C;.  }..#if OS_V
25ad0 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
25ae0 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
25af0 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
25b00 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
25b10 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c  Id==0 ){.    noL
25b20 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ock = 1;.    rc 
25b30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25b40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
25b50 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( noLock ){.    
25b60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
25b70 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
25b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
25b90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
25ba0 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
25bb0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
25bc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
25bd0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
25be0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
25bf0 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
25c00 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
25c10 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
25c20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
25c30 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
25c40 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
25c50 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
25c60 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
25c70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
25c80 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
25c90 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
25ca0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
25cb0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
25cc0 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
25cd0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
25ce0 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
25cf0 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
25d00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
25d10 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
25d20 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
25d30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25d40 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
25d50 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25d60 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
25d70 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
25d80 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
25d90 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
25da0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
25db0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
25dc0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
25dd0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
25de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25df0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
25e00 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
25e10 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
25e20 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
25e30 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
25e40 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
25e50 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
25e60 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
25e70 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
25e80 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
25e90 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
25ea0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
25eb0 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
25ec0 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
25ed0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
25ee0 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
25ef0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
25f00 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
25f10 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
25f20 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
25f30 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
25f40 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
25f50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
25f60 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
25f70 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
25f80 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
25f90 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
25fa0 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
25fb0 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
25fc0 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
25fd0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
25fe0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
25ff0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
26000 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
26010 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
26020 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
26030 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
26040 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
26050 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
26060 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
26070 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
26080 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
26090 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
260a0 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
260b0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
260c0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
260d0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
260e0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
260f0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
26100 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
26110 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
26120 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
26130 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
26140 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
26150 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
26160 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
26170 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
26180 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
26190 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
261a0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
261b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
261c0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
261d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
261e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
261f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
26200 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
26210 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
26220 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
26230 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
26240 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
26250 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
26260 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
26270 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
26280 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
26290 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
262a0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
262b0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
262c0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
262d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
262e0 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
262f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
26300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
26310 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26330 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
26340 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
26350 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
26360 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
26370 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
26380 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
26390 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
263a0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
263b0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
263c0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
263d0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
263e0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
263f0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
26400 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
26410 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
26420 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
26430 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26440 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
26450 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
26460 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
26470 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
264a0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
264b0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
264c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
264d0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
264e0 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
264f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26500 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
26510 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
26520 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
26530 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
26540 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
26550 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
26560 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
26570 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
26580 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
26590 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
265a0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
265b0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
265c0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
265d0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
265e0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
265f0 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
26600 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
26610 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
26620 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
26630 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
26640 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
26650 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
26660 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
26670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26680 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
26690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
266a0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
266b0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
266c0 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
266d0 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
266e0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
266f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
26700 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
26710 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
26720 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
26730 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
26740 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
26750 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
26760 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
26770 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
26780 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
26790 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
267a0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
267b0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
267c0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
267d0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
267e0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
267f0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
26800 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
26810 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
26820 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
26830 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
26840 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
26850 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
26860 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
26870 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
26880 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
26890 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
268a0 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
268b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
268c0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
268d0 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
268e0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
268f0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
26900 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
26910 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
26920 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
26930 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
26940 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
26950 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
26960 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
26970 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
26980 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
26990 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
269a0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
269b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
269c0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
269d0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
269e0 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
269f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26a00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
26a10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
26a20 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
26a30 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
26a40 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
26a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a60 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
26a70 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
26a80 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
26a90 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55   h = -1;.    osU
26aa0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
26ab0 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
26ac0 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
26ad0 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
26ae0 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
26af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26b00 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
26b10 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
26b20 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
26b30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26b40 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
26b50 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
26b60 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
26b70 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
26b80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
26b90 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
26ba0 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
26bb0 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
26bc0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
26bd0 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
26be0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
26bf0 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
26c00 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
26c10 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
26c20 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
26c30 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
26c40 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
26c50 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
26c60 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
26c70 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
26c80 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
26c90 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
26ca0 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
26cb0 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
26cc0 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
26cd0 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
26ce0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
26cf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
26d00 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
26d10 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
26d20 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
26d30 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
26d40 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
26d50 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
26d60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
26d70 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
26d80 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
26d90 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
26da0 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
26db0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
26dc0 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
26dd0 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
26de0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
26df0 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
26e00 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
26e10 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
26e20 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
26e30 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
26e40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
26e50 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
26e60 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
26e70 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
26e80 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
26e90 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
26ea0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
26eb0 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
26ec0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
26ed0 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
26ee0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
26ef0 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
26f00 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
26f10 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
26f20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
26f30 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
26f40 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
26f50 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
26f60 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
26f70 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
26f80 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
26f90 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
26fa0 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
26fb0 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
26fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
26fd0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
26fe0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
26ff0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
27000 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
27010 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
27020 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
27030 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
27040 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
27050 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
27060 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
27070 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
27080 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
27090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
270a0 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
270b0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
270c0 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
270d0 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
270e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
270f0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
27100 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
27110 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
27120 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
27130 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
27140 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
27150 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
27160 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
27170 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
27180 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
27190 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a  X) + 17) >= (siz
271a0 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
271b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
271c0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
271d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
271e0 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
271f0 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
27200 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
27210 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
27220 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
27230 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
27240 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
27250 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
27260 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
27270 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
27280 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
27290 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
272a0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
272b0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
272c0 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
272d0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
272e0 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
272f0 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
27300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27310 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
27320 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
27330 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
27340 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
27350 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
27360 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
27370 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
27380 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
27390 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
273a0 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
273b0 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
273c0 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
273d0 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
273e0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
273f0 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
27400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27410 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
27420 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
27430 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
27440 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
27450 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
27460 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
27470 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
27480 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
27490 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
274a0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
274b0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
274c0 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
274d0 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
274e0 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
274f0 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
27500 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
27510 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
27520 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
27530 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
27540 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
27550 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
27560 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
27570 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27580 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
27590 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
275a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
275b0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
275c0 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
275d0 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
275e0 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
275f0 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
27600 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
27610 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
27620 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
27630 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
27640 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
27650 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
27660 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
27670 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
27680 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
27690 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
276a0 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
276b0 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
276c0 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
276d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
276e0 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
276f0 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
27700 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
27710 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
27720 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27730 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
27740 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
27750 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
27760 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
27770 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
27780 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
27790 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
277a0 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
277b0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
277c0 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
277d0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
277e0 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
277f0 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
27800 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
27810 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
27820 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
27830 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
27840 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
27850 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
27860 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
27870 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
27880 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
27890 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
278a0 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
278b0 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
278c0 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
278d0 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
278e0 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
278f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
27900 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
27930 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
27940 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
27950 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
27960 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
27970 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
27980 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
27990 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
279a0 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
279b0 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
279c0 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
279d0 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
279e0 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
279f0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
27a00 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
27a10 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
27a20 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
27a30 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
27a40 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
27a50 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
27a60 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
27a70 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
27a80 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
27a90 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
27aa0 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
27ab0 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
27ac0 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
27ad0 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
27ae0 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
27af0 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
27b00 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
27b10 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
27b20 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
27b30 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
27b40 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
27b50 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
27b60 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
27b70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
27b80 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
27b90 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
27ba0 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
27bb0 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
27bc0 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
27bd0 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
27c00 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
27c10 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
27c20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
27c30 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
27c40 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
27c50 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
27c60 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
27c70 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
27c80 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
27c90 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
27ca0 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
27cb0 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
27cc0 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
27cd0 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
27ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
27cf0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
27d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27d10 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
27d20 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
27d30 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
27d40 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
27d50 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
27d60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
27d70 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
27d80 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
27d90 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
27da0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
27db0 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
27dc0 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
27dd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
27de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
27df0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
27e00 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
27e10 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
27e20 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
27e30 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
27e40 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
27e50 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
27e60 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
27e70 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27e80 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
27e90 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
27ea0 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
27eb0 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
27ec0 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   If the file bei
27ed0 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74  ng opened is a t
27ee0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69  emporary file, i
27ef0 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61  t is always crea
27f00 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
27f10 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e  octal permission
27f20 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69  s 0600 (read/wri
27f30 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f  table by owner o
27f40 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c  nly). If the fil
27f50 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61  e.** is a databa
27f60 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75  se or master jou
27f70 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73  rnal file, it is
27f80 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
27f90 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
27fa0 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45  * mask SQLITE_DE
27fb0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
27fc0 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69  SSIONS..**.** Fi
27fd0 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69  nally, if the fi
27fe0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
27ff0 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
28000 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
28010 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
28020 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
28030 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
28040 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
28050 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
28060 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
28070 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
28080 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
28090 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
280a0 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
280b0 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
280c0 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
280d0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
280e0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
280f0 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
28100 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
28110 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
28120 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
28130 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
28140 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
28150 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
28160 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
28170 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
28180 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
28190 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
281a0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
281b0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
281c0 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
281d0 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
281e0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
281f0 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
28200 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
28210 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
28220 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28240 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
28250 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
28260 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
28270 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
28280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28290 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
282a0 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
282b0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
282c0 5f 74 20 2a 70 4d 6f 64 65 20 20 20 20 20 20 20  _t *pMode       
282d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
282e0 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
282f0 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
28300 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  h */.){.  int rc
28310 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28330 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
28340 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
28350 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
28360 53 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c  SSIONS;.  if( fl
28370 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
28380 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
28390 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
283a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
283b0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
283c0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
283d0 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
283e0 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
28410 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
28420 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
28430 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
28440 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
28450 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
28460 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
28470 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
28480 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
28490 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
284a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
284b0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
284c0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
284d0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
284e0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
284f0 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
28500 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
28510 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
28520 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
28530 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
28540 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
28550 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
28560 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
28570 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
28580 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
28590 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
285a0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
285b0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
285c0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
285d0 20 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d   a 4 digit decim
285e0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
285f0 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
28600 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
28610 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
28620 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
28630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
28640 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
28650 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
28660 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30      while( nDb>0
28670 20 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d   && zPath[nDb]!=
28680 27 2d 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20  '-' ) nDb--;.   
28690 20 69 66 28 20 6e 44 62 3d 3d 30 20 29 20 72 65   if( nDb==0 ) re
286a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
286b0 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
286c0 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
286d0 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
286e0 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
286f0 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
28700 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
28710 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
28720 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d 65  e & 0777;.    }e
28730 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
28740 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
28750 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
28760 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
28770 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
28780 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
28790 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
287a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
287b0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
287c0 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
287d0 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
287e0 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
287f0 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
28800 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
28810 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
28820 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
28830 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
28840 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
28850 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
28860 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
28870 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
28880 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
28890 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
288a0 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
288b0 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
288c0 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
288d0 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
288e0 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
288f0 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
28900 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
28910 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
28920 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
28930 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
28940 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
28950 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
28960 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
28970 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
28980 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
28990 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
289a0 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
289b0 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
289c0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
289d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
289e0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
289f0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
28a00 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
28a10 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
28a20 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
28a30 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
28a40 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
28a50 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
28a60 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
28a70 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
28a80 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
28a90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
28aa0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
28ab0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
28ac0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
28ad0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
28ae0 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
28af0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28b00 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
28b10 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
28b20 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
28b30 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
28b40 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
28b50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
28b60 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
28b70 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
28b80 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ba0 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
28bb0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
28bc0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
28bd0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
28be0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
28bf0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
28c00 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
28c10 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
28c20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
28c30 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
28c40 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
28c50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
28c60 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
28c70 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
28c80 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
28c90 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
28ca0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
28cb0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
28cc0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
28cd0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
28ce0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
28cf0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
28d00 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d20 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
28d30 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
28d40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
28d50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28d60 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
28d70 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
28d80 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
28d90 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
28da0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
28db0 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
28dc0 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
28dd0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28de0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
28df0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
28e00 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
28e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
28e20 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
28e30 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
28e40 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
28e50 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
28e60 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
28e70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28e80 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
28e90 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
28ea0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
28eb0 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
28ec0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
28ed0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
28ee0 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
28ef0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
28f00 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
28f10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28f20 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
28f30 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
28f40 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
28f50 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
28f60 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
28f70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
28f80 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
28f90 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
28fa0 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
28fb0 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
28fc0 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
28fd0 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
28fe0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
28ff0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
29000 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
29010 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
29020 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
29030 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
29040 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
29050 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29060 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
29070 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29080 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29090 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
290a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
290b0 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
290c0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
290d0 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
290e0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
290f0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
29100 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
29110 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
29120 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
29130 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
29140 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
29150 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
29160 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
29170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
29180 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
29190 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
291a0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
291b0 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
291c0 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
291d0 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
291e0 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
291f0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
29200 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
29210 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
29220 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
29230 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
29240 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
29250 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
29260 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
29270 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
29280 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
29290 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
292a0 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
292b0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
292c0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
292d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
292e0 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
292f0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
29300 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
29310 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
29320 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
29330 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
29340 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
29350 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
29360 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
29370 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
29380 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
29390 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
293a0 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
293b0 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
293c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
293d0 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
293e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
293f0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
29400 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
29410 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
29420 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
29430 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
29440 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29450 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
29460 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
29470 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
29480 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29490 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
294a0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
294b0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
294c0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
294d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
294e0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
294f0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29500 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29510 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29520 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
29530 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
29540 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
29550 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
29560 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
29570 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
29580 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29590 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
295a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
295b0 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
295c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
295d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
295e0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
295f0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
29600 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
29610 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29620 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
29630 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29640 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
29650 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
29660 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29670 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
29680 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29690 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
296a0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
296b0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
296c0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
296d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
296e0 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
296f0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
29700 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
29710 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
29720 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
29730 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
29740 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
29750 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
29760 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
29770 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
29780 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
29790 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
297a0 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
297b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
297c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
297d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
297e0 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
297f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
29800 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
29810 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
29820 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
29830 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
29840 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
29850 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
29860 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a  e && !syncDir);.
29870 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
29880 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
29890 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
298a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
298b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
298c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
298d0 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
298e0 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
298f0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
29900 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
29910 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
29920 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
29930 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
29940 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
29950 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
29960 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
29970 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
29980 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
29990 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
299a0 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
299b0 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
299c0 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
299d0 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
299e0 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
299f0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
29a00 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
29a10 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
29a20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
29a30 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
29a40 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
29a50 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
29a60 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
29a70 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
29a80 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
29a90 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
29aa0 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
29ab0 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
29ac0 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
29ad0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
29ae0 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
29af0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
29b00 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
29b10 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
29b20 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ith */.    rc = 
29b30 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
29b40 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
29b50 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20   &openMode);.   
29b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29b80 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
29b90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29ba0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29bb0 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
29bc0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29bd0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
29be0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29bf0 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
29c00 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
29c10 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
29c20 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
29c30 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
29c40 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
29c50 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
29c60 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
29c70 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
29c80 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
29c90 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
29ca0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
29cb0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
29cc0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
29cd0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
29ce0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
29cf0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
29d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29d10 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
29d20 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
29d30 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
29d40 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
29d50 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
29d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29d70 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
29d80 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
29d90 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
29da0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
29db0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
29dc0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
29dd0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
29de0 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
29df0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
29e00 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29e10 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
29e20 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
29e30 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
29e40 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
29e50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
29e60 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
29e70 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
29e80 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
29e90 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
29ea0 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
29eb0 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
29ec0 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
29ed0 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
29ee0 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
29ef0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
29f00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
29f10 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
29f20 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
29f30 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
29f40 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
29f50 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29f60 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
29f70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
29f80 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
29f90 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43  dif..#ifdef FD_C
29fa0 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
29fb0 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
29fc0 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
29fd0 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
29fe0 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
29ff0 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
2a000 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a010 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
2a020 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2a030 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2a040 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2a050 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
2a060 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
2a070 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2a080 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
2a090 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2a0a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2a0b0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2a0c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a0d0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
2a0e0 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
2a0f0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
2a100 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2a110 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
2a120 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2a130 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
2a140 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2a150 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
2a160 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.  .#if SQLITE_
2a170 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a180 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
2a190 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2a1a0 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
2a1b0 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
2a1c0 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
2a1d0 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
2a1e0 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
2a1f0 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
2a200 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
2a210 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
2a220 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2a230 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
2a240 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
2a250 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
2a260 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2a270 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
2a280 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
2a290 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
2a2a0 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
2a2b0 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
2a2c0 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
2a2d0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
2a2e0 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
2a2f0 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
2a300 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
2a310 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
2a320 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
2a330 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  {.      if( stat
2a340 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
2a350 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2a360 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
2a370 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20  , the close(fd) 
2a380 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69  call is sub-opti
2a390 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65  mal. If the file
2a3a0 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20   opened.        
2a3b0 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20  ** with fd is a 
2a3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2a3d0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  nd there are oth
2a3e0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  er connections o
2a3f0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2a400 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
2a410 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68   are currently h
2a420 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20  olding advisory 
2a430 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20  locks on it,.   
2a440 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2a450 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
2a460 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f   will cancel tho
2a470 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61  se locks. In pra
2a480 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a  ctice,.        *
2a490 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
2a4a0 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64   that statfs() d
2a4b0 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79  oesn't fail very
2a4c0 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74   often. At least
2a4d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2a4e0 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65  while other file
2a4f0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2a500 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
2a510 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20  process on.     
2a520 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66     ** the same f
2a530 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e  ile are working.
2a540 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e    */.        p->
2a550 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2a560 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  o;.        robus
2a570 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2a580 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2a590 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a5a0 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
2a5b0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2a5c0 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
2a5d0 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2a5e0 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
2a5f0 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
2a600 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
2a610 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
2a620 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2a630 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e 63  e(pVfs, fd, sync
2a640 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  Dir, pFile, zPat
2a650 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20  h, noLock,.     
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2a680 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  sReadonly);.    
2a690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2a6b0 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
2a6c0 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
2a6d0 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
2a6e0 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
2a6f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
2a710 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
2a720 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
2a730 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
2a740 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
2a750 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
2a760 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
2a770 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
2a780 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
2a790 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
2a7a0 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
2a7b0 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
2a7c0 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
2a7d0 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
2a7e0 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
2a7f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
2a800 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
2a810 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a820 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2a830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
2a840 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2a850 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a860 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
2a870 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
2a880 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46   fd, syncDir, pF
2a890 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
2a8a0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
2a8b0 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65            isDele
2a8c0 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b  te, isReadonly);
2a8d0 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
2a8e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a8f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2a900 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
2a910 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
2a920 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2a930 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2a940 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2a950 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2a960 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
2a970 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
2a980 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
2a990 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
2a9a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
2a9b0 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2a9c0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2a9d0 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
2a9e0 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
2a9f0 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
2aa00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2aa10 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
2aa20 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2aa30 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2aa40 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2aa60 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
2aa70 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2aa80 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
2aa90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2aaa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
2aab0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2aac0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2aad0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2aae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2aaf0 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
2ab00 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
2ab10 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  ) && errno!=ENOE
2ab20 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  NT ){.    return
2ab30 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2ab40 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2ab50 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
2ab60 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  th);.  }.#ifndef
2ab70 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2ab80 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69  DIRSYNC.  if( di
2ab90 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74  rSync ){.    int
2aba0 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73   fd;.    rc = os
2abb0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  OpenDirectory(zP
2abc0 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
2abd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2abe0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2abf0 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
2ac00 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
2ac10 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
2ac20 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
2ac30 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2ac40 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2ac50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2ac60 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
2ac70 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
2ac80 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
2ac90 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2aca0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
2acb0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2acc0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2acd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ace0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
2acf0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2ad00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2ad10 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2ad20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2ad30 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2ad40 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2ad50 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2ad60 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2ad70 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2ad80 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2ad90 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2ada0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2adb0 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2adc0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2add0 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2ade0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2adf0 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2ae00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2ae10 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2ae20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2ae30 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2ae40 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2ae50 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2ae60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2ae70 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2ae80 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2ae90 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2aea0 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2aeb0 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2aec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2aed0 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2aee0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2aef0 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2af00 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2af10 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2af20 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2af30 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2af40 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2af50 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2af60 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2af70 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2af80 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2af90 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2afa0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2afb0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2afc0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2afd0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2afe0 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2aff0 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2b000 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2b010 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2b020 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2b030 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2b040 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2b050 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2b060 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2b070 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2b080 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2b090 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2b0a0 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2b0b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2b0c0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2b0d0 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2b0e0 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2b0f0 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2b100 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2b110 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2b120 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2b130 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2b140 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2b150 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2b160 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2b170 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2b180 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
2b190 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  t_size==0 ){.   
2b1a0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b     *pResOut = 0;
2b1b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b1d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
2b1e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b1f0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2b200 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
2b210 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
2b220 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
2b230 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2b240 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
2b250 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
2b260 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
2b270 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
2b280 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
2b290 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
2b2a0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
2b2b0 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
2b2c0 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
2b2d0 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
2b2e0 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
2b2f0 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
2b300 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
2b310 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2b320 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
2b330 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2b340 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2b350 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b360 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2b370 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b380 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2b390 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2b3a0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2b3b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2b3e0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2b3f0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2b400 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
2b410 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2b420 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2b430 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2b440 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2b450 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2b460 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2b470 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2b480 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2b490 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2b4a0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2b4b0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2b4c0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2b4d0 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
2b4e0 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
2b4f0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
2b500 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
2b510 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2b520 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
2b530 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
2b540 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2b550 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2b560 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
2b570 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
2b580 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
2b590 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b5a0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
2b5b0 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
2b5c0 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
2b5d0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
2b5e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2b5f0 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
2b600 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
2b610 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
2b620 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
2b630 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
2b640 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b650 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2b660 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2b670 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
2b680 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2b690 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
2b6a0 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
2b6b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2b6c0 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
2b6d0 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
2b6e0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
2b6f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b700 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b710 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2b720 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2b730 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2b740 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2b750 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2b760 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2b770 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2b780 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2b790 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2b7a0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
2b7b0 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
2b7c0 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
2b7d0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2b7e0 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
2b7f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b800 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b810 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2b820 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
2b830 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
2b840 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
2b850 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
2b860 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2b870 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
2b880 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
2b890 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
2b8a0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
2b8b0 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
2b8c0 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
2b8d0 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
2b8e0 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
2b8f0 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
2b900 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
2b910 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
2b920 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
2b930 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
2b940 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
2b950 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
2b960 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
2b970 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
2b980 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
2b990 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2b9a0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2b9b0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2b9c0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2b9d0 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
2b9e0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
2b9f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2ba00 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
2ba10 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
2ba20 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
2ba30 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2ba40 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ba50 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
2ba60 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
2ba70 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2ba80 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
2ba90 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
2baa0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2bab0 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
2bac0 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
2bad0 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
2bae0 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
2baf0 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
2bb00 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
2bb10 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
2bb20 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
2bb30 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
2bb40 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2bb50 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
2bb60 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
2bb70 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
2bb80 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
2bb90 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
2bba0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2bbb0 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
2bbc0 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
2bbd0 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
2bbe0 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
2bbf0 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
2bc00 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
2bc10 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
2bc20 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
2bc30 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
2bc40 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
2bc50 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
2bc60 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
2bc70 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2bc80 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
2bc90 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
2bca0 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
2bcb0 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
2bcc0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
2bcd0 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
2bce0 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
2bcf0 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
2bd00 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
2bd10 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
2bd20 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
2bd30 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
2bd40 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
2bd50 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
2bd60 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
2bd70 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
2bd80 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
2bd90 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2bda0 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
2bdb0 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
2bdc0 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
2bdd0 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
2bde0 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
2bdf0 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
2be00 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
2be10 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
2be20 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
2be30 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
2be40 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2be50 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
2be60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2be70 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
2be80 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
2be90 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
2bea0 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
2beb0 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
2bec0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2bed0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2bee0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
2bef0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
2bf00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2bf10 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
2bf20 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
2bf30 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2bf40 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2bf50 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2bf60 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2bf70 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
2bf80 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
2bf90 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
2bfa0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
2bfb0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
2bfc0 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2bfd0 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
2bfe0 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
2bff0 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
2c000 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
2c010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c020 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
2c030 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2c040 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2c050 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2c060 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c070 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
2c080 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
2c090 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
2c0a0 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
2c0b0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
2c0c0 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
2c0d0 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
2c0e0 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
2c0f0 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
2c100 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
2c110 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
2c120 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
2c130 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
2c140 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
2c150 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
2c160 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
2c170 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
2c180 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
2c190 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
2c1a0 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
2c1b0 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
2c1c0 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
2c1d0 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
2c1e0 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
2c1f0 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
2c200 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
2c210 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
2c220 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
2c230 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
2c240 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
2c250 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
2c260 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
2c270 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
2c280 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
2c290 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
2c2a0 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
2c2b0 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
2c2c0 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
2c2d0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
2c2e0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
2c2f0 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
2c300 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
2c310 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
2c320 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
2c330 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
2c340 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2c350 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
2c360 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
2c370 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
2c380 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
2c390 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
2c3a0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2c3b0 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
2c3c0 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
2c3d0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
2c3e0 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
2c3f0 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
2c400 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
2c410 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
2c420 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
2c430 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
2c440 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
2c450 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
2c460 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
2c470 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
2c480 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
2c490 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
2c4a0 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20       do{ nBuf = 
2c4b0 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
2c4c0 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
2c4d0 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d  nBuf<0 && errno=
2c4e0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
2c4f0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2c500 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2c510 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c520 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
2c530 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
2c540 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
2c550 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
2c560 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
2c570 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
2c580 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
2c590 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c5a0 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
2c5b0 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
2c5c0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2c5d0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
2c5e0 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
2c5f0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
2c600 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
2c610 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
2c620 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
2c630 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
2c640 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
2c650 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2c660 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
2c670 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
2c680 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
2c690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c6a0 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
2c6b0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2c6c0 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
2c6d0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2c6e0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2c6f0 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
2c700 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
2c710 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
2c720 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
2c730 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
2c740 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
2c750 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
2c760 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
2c770 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2c780 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2c790 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
2c7a0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
2c7b0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
2c7c0 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
2c7d0 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
2c7e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c7f0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2c800 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
2c810 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
2c820 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
2c830 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
2c840 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
2c850 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2c860 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c870 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
2c880 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
2c890 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
2c8a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2c8b0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2c8c0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2c8d0 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2c8e0 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2c8f0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2c900 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2c910 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2c920 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2c930 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2c940 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2c950 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2c960 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2c970 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2c980 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2c990 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2c9a0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2c9b0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2c9c0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2c9d0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2c9e0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2c9f0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2ca00 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2ca10 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2ca20 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2ca30 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2ca40 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2ca50 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2ca60 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2ca70 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2ca80 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2ca90 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2caa0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2cab0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2cac0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2cad0 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2cae0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2caf0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2cb00 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
2cb10 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
2cb20 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2cb30 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2cb40 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2cb50 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2cb60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2cb70 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
2cb80 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2cb90 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
2cba0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
2cbb0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2cbc0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
2cbd0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
2cbe0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2cbf0 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  000;.#if defined
2cc00 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
2cc10 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
2cc20 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
2cc30 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
2cc40 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
2cc50 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
2cc60 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
2cc70 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
2cc80 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
2cc90 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
2cca0 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
2ccb0 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2ccc0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2ccd0 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2cce0 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
2ccf0 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
2cd00 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
2cd10 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
2cd20 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69  &sNow, 0);.  *pi
2cd30 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
2cd40 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
2cd50 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
2cd60 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
2cd70 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
2cd80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2cd90 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
2cda0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
2cdb0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
2cdc0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2cdd0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
2cde0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
2cdf0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
2ce00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ce10 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2ce20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ce30 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2ce40 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2ce50 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2ce60 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
2ce70 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
2ce80 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2ce90 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2cea0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
2ceb0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
2cec0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2ced0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
2cee0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
2cef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2cf00 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
2cf10 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2cf20 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
2cf30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
2cf40 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  64 i;.  UNUSED_P
2cf50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2cf60 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74  );.  unixCurrent
2cf70 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
2cf80 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
2cf90 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
2cfa0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2cfb0 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
2cfc0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
2cfd0 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
2cfe0 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
2cff0 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
2d000 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
2d010 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
2d020 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
2d030 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
2d040 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
2d050 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
2d060 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
2d070 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
2d080 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
2d090 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
2d0a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
2d0b0 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
2d0c0 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
2d0d0 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
2d0e0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2d0f0 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
2d100 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2d110 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
2d120 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
2d130 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
2d140 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2d150 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
2d160 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d170 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
2d180 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
2d190 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2d1a0 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
2d1c0 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
2d1d0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2d1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2d200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d240 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
2d250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d290 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2d2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2b0 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
2d2c0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
2d2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2e0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
2d2f0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
2d300 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
2d310 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
2d320 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
2d330 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
2d340 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
2d350 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
2d360 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
2d370 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
2d380 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
2d390 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2d3a0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
2d3b0 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
2d3c0 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
2d3d0 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2d3e0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
2d3f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2d400 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
2d410 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
2d420 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
2d430 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
2d440 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
2d450 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
2d460 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
2d470 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2d480 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
2d490 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
2d4a0 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
2d4b0 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
2d4c0 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
2d4d0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
2d4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
2d4f0 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
2d500 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
2d510 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2d520 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
2d530 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
2d540 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
2d550 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
2d560 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
2d570 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
2d580 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
2d590 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
2d5a0 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
2d5b0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2d5c0 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
2d5d0 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
2d5e0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
2d5f0 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
2d600 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
2d610 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
2d620 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
2d630 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
2d640 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
2d650 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
2d660 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
2d670 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2d680 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
2d690 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
2d6a0 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
2d6b0 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
2d6c0 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
2d6d0 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
2d6e0 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
2d6f0 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
2d700 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
2d710 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
2d720 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
2d730 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
2d740 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
2d750 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
2d760 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
2d770 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
2d780 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2d790 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
2d7a0 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
2d7b0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
2d7c0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
2d7d0 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
2d7e0 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
2d7f0 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
2d800 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
2d810 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
2d820 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
2d830 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
2d840 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
2d850 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2d860 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
2d870 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
2d880 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
2d890 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
2d8a0 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
2d8b0 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
2d8c0 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
2d8d0 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
2d8e0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
2d8f0 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
2d900 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
2d910 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
2d920 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
2d930 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
2d940 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
2d950 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
2d960 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
2d970 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
2d980 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
2d990 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
2d9a0 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
2d9b0 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
2d9c0 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
2d9d0 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
2d9e0 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
2d9f0 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
2da00 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
2da10 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
2da20 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
2da30 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
2da40 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
2da50 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
2da60 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
2da70 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
2da80 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
2da90 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
2daa0 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
2dab0 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
2dac0 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
2dad0 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
2dae0 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
2daf0 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
2db00 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
2db10 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
2db20 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
2db30 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
2db40 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
2db50 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
2db60 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
2db70 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
2db80 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
2db90 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
2dba0 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
2dbb0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2dbc0 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
2dbd0 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
2dbe0 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
2dbf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2dc00 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
2dc10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2dc20 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2dc30 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2dc40 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc60 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
2dc70 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
2dc80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2dc90 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2dca0 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
2dcb0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
2dcc0 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
2dcd0 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
2dce0 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
2dcf0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2dd00 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
2dd10 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
2dd20 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2dd30 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2dd40 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
2dd50 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
2dd60 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
2dd70 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
2dd80 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
2dd90 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
2dda0 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
2ddb0 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
2ddc0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2ddd0 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
2dde0 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
2ddf0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
2de00 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
2de10 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
2de20 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2de30 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
2de40 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
2de50 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
2de60 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
2de70 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
2de80 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
2de90 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2dea0 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
2deb0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2dec0 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
2ded0 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
2dee0 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
2def0 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
2df00 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
2df10 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
2df20 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
2df30 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
2df40 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
2df50 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
2df60 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2df70 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
2df80 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
2df90 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
2dfa0 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
2dfb0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
2dfc0 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
2dfd0 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
2dfe0 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
2dff0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
2e000 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
2e010 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
2e020 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
2e030 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
2e040 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
2e050 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2e060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2e070 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
2e080 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
2e090 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
2e0a0 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
2e0b0 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
2e0c0 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
2e0d0 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
2e0e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2e0f0 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
2e100 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
2e110 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
2e120 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
2e130 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
2e140 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2e150 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
2e160 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
2e170 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
2e180 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
2e190 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
2e1a0 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
2e1b0 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
2e1c0 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
2e1d0 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
2e1e0 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
2e1f0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2e200 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
2e210 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
2e220 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
2e230 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
2e240 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
2e250 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
2e260 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
2e270 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
2e280 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
2e290 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
2e2a0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
2e2b0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
2e2c0 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2e2d0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
2e2e0 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
2e2f0 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
2e300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2e310 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
2e320 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
2e330 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
2e340 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2e350 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
2e360 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2e370 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
2e380 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
2e390 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
2e3a0 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
2e3b0 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
2e3c0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
2e3d0 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
2e3e0 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
2e3f0 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
2e400 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
2e410 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
2e420 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
2e430 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
2e440 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
2e450 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
2e460 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
2e470 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
2e480 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
2e490 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
2e4a0 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
2e4b0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2e4c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
2e4d0 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
2e4e0 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
2e4f0 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
2e500 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
2e510 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
2e520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e530 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
2e540 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
2e550 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
2e560 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2e570 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
2e580 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
2e590 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
2e5a0 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
2e5b0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
2e5c0 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
2e5d0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2e5e0 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
2e5f0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
2e600 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
2e610 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
2e620 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
2e630 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
2e640 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
2e650 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
2e660 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
2e670 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
2e680 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
2e690 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
2e6a0 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
2e6b0 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
2e6c0 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
2e6d0 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
2e6e0 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
2e6f0 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
2e700 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
2e710 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
2e720 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2e730 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
2e740 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
2e750 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
2e760 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
2e770 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
2e780 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
2e790 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
2e7a0 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
2e7b0 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
2e7c0 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
2e7d0 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
2e7e0 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
2e7f0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
2e800 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
2e810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e820 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
2e830 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2e840 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
2e850 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2e860 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
2e870 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
2e880 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
2e890 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
2e8a0 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
2e8b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
2e8c0 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
2e8d0 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
2e8e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
2e8f0 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
2e900 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
2e910 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
2e920 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
2e930 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
2e940 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
2e950 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
2e960 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
2e970 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
2e980 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
2e990 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
2e9a0 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
2e9b0 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
2e9c0 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
2e9d0 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
2e9e0 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
2e9f0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
2ea00 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
2ea10 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
2ea20 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2ea30 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
2ea40 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
2ea50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ea60 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2ea70 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
2ea80 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2ea90 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
2eaa0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
2eab0 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
2eac0 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
2ead0 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
2eae0 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
2eaf0 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
2eb00 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
2eb10 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
2eb20 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
2eb30 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2eb40 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2eb50 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
2eb60 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2eb70 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
2eb80 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2eb90 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
2eba0 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
2ebb0 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
2ebc0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
2ebd0 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
2ebe0 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
2ebf0 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
2ec00 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2ec10 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
2ec20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2ec30 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
2ec40 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
2ec50 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2ec60 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
2ec70 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
2ec80 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
2ec90 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
2eca0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2ecb0 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
2ecc0 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2ecd0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
2ece0 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
2ecf0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2ed00 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2ed10 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ed20 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
2ed30 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
2ed40 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
2ed50 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
2ed60 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
2ed70 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
2ed80 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
2ed90 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
2eda0 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
2edb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
2edc0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2edd0 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
2ede0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
2edf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ee00 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
2ee10 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
2ee20 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
2ee30 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
2ee40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ee50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2ee60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
2ee70 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
2ee80 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
2ee90 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2eea0 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
2eeb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
2eec0 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
2eed0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2eee0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
2eef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2ef00 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
2ef10 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
2ef20 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
2ef30 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
2ef40 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
2ef50 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
2ef60 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
2ef70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
2ef80 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
2ef90 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
2efa0 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
2efb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
2efc0 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
2efd0 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
2efe0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
2eff0 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
2f000 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
2f010 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
2f020 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
2f030 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
2f040 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
2f050 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
2f060 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
2f070 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
2f080 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
2f090 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
2f0a0 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
2f0b0 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
2f0c0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2f0d0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f0e0 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
2f0f0 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
2f100 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
2f110 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
2f120 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
2f130 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
2f140 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2f150 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
2f160 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
2f170 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
2f180 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2f190 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
2f1a0 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
2f1b0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2f1c0 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
2f1d0 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
2f1e0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
2f1f0 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
2f200 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
2f210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f220 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
2f230 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2f240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f250 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
2f260 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2f270 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
2f280 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
2f290 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
2f2a0 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2f2b0 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
2f2c0 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
2f2d0 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
2f2e0 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
2f2f0 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
2f300 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
2f310 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
2f320 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
2f330 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
2f340 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
2f350 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
2f360 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2f370 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
2f380 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
2f390 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
2f3a0 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
2f3b0 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
2f3c0 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
2f3d0 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
2f3e0 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
2f3f0 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
2f400 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2f410 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
2f420 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
2f430 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
2f440 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2f450 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
2f460 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2f470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f480 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
2f490 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
2f4a0 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
2f4b0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
2f4c0 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
2f4d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2f4e0 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
2f4f0 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
2f500 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
2f510 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
2f520 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2f530 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
2f540 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
2f550 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
2f560 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
2f570 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2f580 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
2f590 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
2f5a0 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
2f5b0 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
2f5c0 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
2f5d0 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
2f5e0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
2f5f0 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
2f600 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
2f610 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
2f620 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
2f630 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
2f640 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
2f650 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
2f660 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
2f670 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f680 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
2f690 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
2f6a0 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
2f6b0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2f6c0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
2f6d0 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
2f6e0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
2f6f0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
2f700 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  ( mkdir(buf, SQL
2f710 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2f720 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2f730 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2f740 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2f750 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
2f760 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
2f770 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
2f780 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
2f790 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
2f7a0 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
2f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
2f7c0 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
2f7d0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f7f0 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
2f800 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
2f810 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2f820 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2f830 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
2f840 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f850 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
2f860 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
2f870 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
2f880 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
2f890 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2f8a0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2f8b0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2f8c0 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  \n", lockPath, g
2f8d0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
2f8e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2f8f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
2f900 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f910 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
2f920 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2f930 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
2f940 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
2f950 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
2f960 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
2f970 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
2f980 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
2f990 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
2f9a0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
2f9b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2f9c0 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
2f9d0 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
2f9e0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
2f9f0 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
2fa00 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
2fa10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2fa20 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
2fa30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2fa40 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
2fa50 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
2fa60 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
2fa70 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
2fa80 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
2fa90 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
2faa0 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
2fab0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
2fac0 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
2fad0 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
2fae0 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
2faf0 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
2fb00 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
2fb10 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
2fb20 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2fb30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2fb40 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
2fb50 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
2fb60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
2fb70 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
2fb80 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
2fb90 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2fba0 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
2fbb0 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
2fbc0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
2fbd0 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
2fbe0 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
2fbf0 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
2fc00 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
2fc10 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
2fc20 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
2fc30 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
2fc40 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
2fc50 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
2fc60 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
2fc70 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
2fc80 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
2fc90 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
2fca0 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
2fcb0 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
2fcc0 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
2fcd0 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
2fce0 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
2fcf0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
2fd00 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2fd10 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
2fd20 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
2fd30 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
2fd40 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2fd50 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
2fd60 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2fd70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2fd80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2fd90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
2fda0 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
2fdb0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
2fdc0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2fdd0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2fde0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2fdf0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
2fe00 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2fe10 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
2fe20 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
2fe30 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
2fe40 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
2fe50 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
2fe60 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
2fe70 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fe80 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2fe90 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fea0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2feb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fec0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2fed0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
2fee0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
2fef0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
2ff00 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2ff10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2ff20 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2ff30 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2ff40 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
2ff50 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
2ff60 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2ff70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ff80 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
2ff90 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
2ffa0 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
2ffb0 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
2ffc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2ffd0 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
2ffe0 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
2fff0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30000 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
30010 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
30020 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
30030 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
30040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
30050 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
30060 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
30070 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
30080 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
30090 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
300a0 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
300b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
300c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
300d0 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
300e0 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
300f0 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
30100 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e  unixFile));.  pN
30110 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  ew->openFlags = 
30120 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d  openFlags;.  mem
30130 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30  set(&dummyVfs, 0
30140 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66  , sizeof(dummyVf
30150 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  s));.  dummyVfs.
30160 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
30170 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
30180 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  der;.  dummyVfs.
30190 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b  zName = "dummy";
301a0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
301b0 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
301c0 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
301d0 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73  s;.  pNew->pUnus
301e0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
301f0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
30200 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
30210 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c 69 74 65  , fd, 0, (sqlite
30220 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
30230 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  th, 0, 0, 0);.  
30240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30250 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
30260 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
30270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30280 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
30290 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
302a0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
302b0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
302c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
302d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
302e0 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
302f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
30300 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
30310 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
30320 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
30330 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
30340 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
30350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
30360 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
30370 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
30380 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
30390 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
303a0 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
303b0 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
303c0 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
303d0 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
303e0 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
303f0 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
30400 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
30410 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
30420 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
30430 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
30440 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
30450 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
30460 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
30470 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
30480 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
30490 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
304a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
304b0 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
304c0 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
304d0 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
304e0 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
304f0 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
30500 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
30510 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
30520 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
30530 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
30540 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
30550 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
30560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
30570 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
30580 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
30590 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
305a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
305b0 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
305c0 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
305d0 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
305e0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
305f0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
30600 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
30610 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
30620 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
30630 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
30640 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
30650 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
30660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
30670 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
30680 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30690 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
306a0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
306b0 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
306c0 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
306d0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
306e0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
306f0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
30700 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
30710 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
30720 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
30730 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
30740 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
30750 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
30760 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
30770 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
30780 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
30790 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
307a0 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
307b0 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
307c0 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
307d0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
307e0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
307f0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
30800 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
30810 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
30820 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
30830 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
30840 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
30850 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
30860 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
30870 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
30880 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
30890 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
308a0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
308b0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
308c0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
308d0 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
308e0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
308f0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
30900 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
30910 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
30920 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
30930 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
30940 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
30950 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
30960 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
30970 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
30980 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
30990 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
309a0 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
309b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
309c0 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
309d0 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
309e0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
309f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30a00 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
30a10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
30a20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
30a30 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
30a40 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30a50 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30a60 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30a70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
30a80 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
30a90 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
30aa0 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
30ab0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
30ac0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
30ad0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
30ae0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
30af0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
30b00 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
30b10 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
30b20 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
30b30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
30b40 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
30b50 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
30b60 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
30b70 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
30b80 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
30b90 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
30ba0 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
30bb0 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
30bc0 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
30bd0 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
30be0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
30bf0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
30c00 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
30c10 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
30c20 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
30c30 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
30c40 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
30c50 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
30c60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30c70 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30c80 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
30c90 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
30ca0 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
30cb0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30cc0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
30cd0 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
30ce0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
30cf0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
30d00 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
30d10 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
30d20 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
30d30 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
30d40 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
30d50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30d60 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
30d70 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
30d80 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
30d90 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
30da0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30db0 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
30dc0 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
30dd0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
30de0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
30df0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
30e00 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
30e10 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20  O_EXCL),.       
30e20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
30e30 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30e40 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30e50 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
30e60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e70 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30e80 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
30e90 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
30ea0 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
30eb0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30ec0 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
30ed0 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
30ee0 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
30ef0 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
30f00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30f10 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30f20 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
30f30 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30f40 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30f50 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30f60 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
30f70 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
30f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30f90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30fa0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
30fb0 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
30fc0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
30fd0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30fe0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
30ff0 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
31000 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
31010 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
31020 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
31030 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
31040 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
31050 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
31060 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
31070 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
31080 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
31090 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
310a0 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
310b0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
310c0 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
310d0 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
310e0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
310f0 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
31100 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  __);.    }.    f
31110 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31120 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
31130 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
31140 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
31150 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
31160 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
31170 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
31180 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
31190 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
311a0 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
311b0 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
311c0 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
311d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
311e0 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
311f0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
31200 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
31210 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
31220 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31230 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
31240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
31250 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
31260 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
31270 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
31280 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
31290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
312a0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
312b0 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
312c0 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
312d0 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65  ModTime;.  .  me
312e0 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69  mset(&conchModTi
312f0 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f  me, 0, sizeof(co
31300 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20  nchModTime));.  
31310 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
31320 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
31330 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
31340 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
31350 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
31360 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
31370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
31380 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
31390 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
313a0 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
313b0 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
313c0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
313d0 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
313e0 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
313f0 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
31400 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
31410 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
31420 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
31430 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
31440 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
31450 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
31460 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
31470 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
31480 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
31490 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
314a0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
314b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
314c0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
314d0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
314e0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
314f0 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
31500 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
31510 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
31520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31530 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
31540 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
31550 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29   if( nTries==1 )
31560 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  {.        conchM
31570 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f  odTime = buf.st_
31580 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20  mtimespec;.     
31590 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30     usleep(500000
315a0 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73  ); /* wait 0.5 s
315b0 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
315c0 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20  ock again*/.    
315d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
315e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
315f0 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20  ssert( nTries>1 
31600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e  );.      if( con
31610 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63  chModTime.tv_sec
31620 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
31630 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a  spec.tv_sec || .
31640 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f           conchMo
31650 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d  dTime.tv_nsec !=
31660 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
31670 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20  c.tv_nsec ){.   
31680 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31690 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
316a0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
316b0 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20  ( nTries==2 ){  
316c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42  .        char tB
316d0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
316e0 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
316f0 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64  nt len = osPread
31700 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
31710 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
31720 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
31730 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
31740 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
31750 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
31760 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
31770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
31780 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
31790 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
317a0 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
317b0 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
317c0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
317d0 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
317e0 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
317f0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
31800 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
31810 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
31820 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
31830 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
31840 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
31850 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
31860 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
31870 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31880 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
31890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
318a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
318b0 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
318c0 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
318d0 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
318e0 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
318f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31900 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
31910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
31920 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
31930 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
31940 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
31950 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
31960 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
31970 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
31980 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
31990 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
319a0 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
319b0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
319c0 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
319d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
319e0 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
319f0 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
31a00 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
31a10 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
31a20 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
31a30 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31a40 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
31a50 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
31a60 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
31a70 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
31a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31a90 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
31aa0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
31ab0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
31ac0 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
31ad0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31ae0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
31af0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
31b00 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
31b10 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
31b20 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
31b30 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
31b40 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
31b50 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
31b60 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
31b70 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
31b80 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
31b90 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
31ba0 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
31bb0 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
31bc0 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
31bd0 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
31be0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
31bf0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
31c00 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
31c10 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
31c20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
31c30 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
31c40 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
31c50 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
31c60 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
31c70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31c80 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
31c90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
31ca0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
31cb0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
31cc0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
31cd0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
31ce0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
31cf0 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
31d00 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
31d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31d20 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
31d30 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
31d40 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
31d50 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
31d60 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
31d70 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
31d80 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
31d90 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
31da0 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
31db0 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
31dc0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
31dd0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
31de0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
31df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31e00 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
31e10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
31e20 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
31e30 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
31e40 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
31e50 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
31e60 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
31e70 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
31e80 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
31e90 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
31ea0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
31eb0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
31ec0 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
31ed0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
31ee0 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
31ef0 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
31f00 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
31f10 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
31f20 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
31f30 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
31f40 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
31f50 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
31f60 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
31f70 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
31f80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
31f90 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
31fa0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
31fb0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
31fc0 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
31fd0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
31fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31ff0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
32000 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
32010 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
32020 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
32030 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
32040 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
32050 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
32060 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
32070 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
32080 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
32090 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
320a0 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
320b0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
320c0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
320d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
320e0 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
320f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
32100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32110 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
32120 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
32130 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
32140 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
32150 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
32160 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
32170 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
32180 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
32190 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
321a0 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
321b0 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
321c0 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
321d0 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
321e0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
321f0 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
32200 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
32210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
32220 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
32230 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
32240 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
32250 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
32260 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
32270 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
32280 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
32290 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
322a0 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
322b0 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
322c0 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
322d0 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
322e0 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
322f0 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
32300 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
32310 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
32320 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
32330 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
32340 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
32350 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
32360 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
32370 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
32380 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
32390 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
323a0 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
323b0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
323c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323e0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
323f0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
32400 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
32410 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
32420 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
32430 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
32440 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
32450 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
32460 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
32470 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
32480 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
32490 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
324a0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
324b0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
324c0 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
324d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
324e0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
324f0 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
32500 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
32510 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
32520 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
32530 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
32540 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
32550 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
32560 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
32570 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
32580 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
32590 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
325a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
325b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
325c0 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
325d0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
325e0 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
325f0 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
32600 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
32610 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
32620 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
32630 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
32640 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
32650 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
32660 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
32670 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
32680 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
32690 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
326a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
326b0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
326c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
326d0 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
326e0 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
326f0 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
32700 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
32710 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
32720 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
32730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32740 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
32750 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
32760 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
32770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
32780 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
32790 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
327a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
327b0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
327c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
327d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
327e0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
327f0 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
32800 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
32810 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
32820 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
32830 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
32840 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
32850 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32860 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32870 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32880 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
32890 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
328a0 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
328b0 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
328c0 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
328d0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
328e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
328f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
32900 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
32910 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
32920 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
32930 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
32940 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
32950 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
32960 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
32970 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
32980 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
32990 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
329a0 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
329b0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
329c0 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
329d0 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
329e0 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
329f0 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
32a00 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
32a10 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
32a20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
32a30 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
32a40 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
32a50 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
32a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
32a70 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
32a80 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
32a90 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
32aa0 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
32ab0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
32ac0 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
32ad0 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70   && conchFile->p
32ae0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
32af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
32b00 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
32b10 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
32b20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
32b30 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
32b40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
32b50 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
32b60 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
32b70 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
32b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32b90 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
32ba0 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20    } else {      
32bb0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72      .          r
32bc0 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
32bd0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
32be0 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ID, EXCLUSIVE_LO
32bf0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
32c00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32c10 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
32c20 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
32c30 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
32c40 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43  *)conchFile, EXC
32c50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
32c60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32c80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72  .        char wr
32c90 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32ca0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
32cb0 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53        int writeS
32cc0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
32cd0 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42   .        writeB
32ce0 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72  uffer[0] = (char
32cf0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
32d00 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ION;.        mem
32d10 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
32d20 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
32d30 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
32d40 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
32d50 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
32d60 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d  >lockProxyPath!=
32d70 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
32d80 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
32d90 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
32da0 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c  HINDEX], pCtx->l
32db0 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41  ockProxyPath, MA
32dc0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
32dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32de0 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
32df0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
32e00 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c  ATHINDEX], tempL
32e10 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
32e20 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEN);.        }.
32e30 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a          writeSiz
32e40 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  e = PROXY_PATHIN
32e50 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72  DEX + strlen(&wr
32e60 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32e70 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20  PATHINDEX]);.   
32e80 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75       robust_ftru
32e90 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d  ncate(conchFile-
32ea0 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a  >h, writeSize);.
32eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
32ec0 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f  xWrite((sqlite3_
32ed0 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65  file *)conchFile
32ee0 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77  , writeBuffer, w
32ef0 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  riteSize, 0);.  
32f00 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63        fsync(conc
32f10 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20  hFile->h);.     
32f20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
32f30 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20  ted a new conch 
32f40 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75  file (not just u
32f50 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65  pdated the conte
32f60 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20  nts of a .      
32f70 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63     ** valid conc
32f80 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20  h file), try to 
32f90 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73  match the permis
32fa0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74  sions of the dat
32fb0 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20  abase .         
32fc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
32fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32fe0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
32ff0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
33000 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
33010 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73      int err = os
33020 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
33030 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  &buf);.         
33040 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20   if( err==0 ){. 
33050 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f             mode_
33060 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74  t cmode = buf.st
33070 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53  _mode&(S_IRUSR|S
33080 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50  _IWUSR | S_IRGRP
33090 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20  |S_IWGRP |.     
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330c0 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f     S_IROTH|S_IWO
330d0 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TH);.           
330e0 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68   /* try to match
330f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33100 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f  le R/W permissio
33110 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75  ns, ignore failu
33120 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  re */.#ifndef SQ
33130 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
33140 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 46  .            osF
33150 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d  chmod(conchFile-
33160 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73  >h, cmode);.#els
33170 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  e.            do
33180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33190 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f  rc = osFchmod(co
331a0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
331b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
331c0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29  }while( rc==(-1)
331d0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
331e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
331f0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
33200 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
33210 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
33220 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
33230 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
33240 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74  od %o FAILED wit
33250 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  h %d %s\n",.    
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33270 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73    cmode, code, s
33280 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
33290 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
332a0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
332b0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
332c0 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
332d0 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29  CCEDED\n",cmode)
332e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
332f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
33300 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
33310 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
33320 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
33330 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
33340 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
33350 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20   %d %s\n", .    
33360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33370 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  err, code, strer
33380 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64  ror(code));.#end
33390 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  if.          }. 
333a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
333b0 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65  .      conchFile
333c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
333d0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
333e0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
333f0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
33400 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f   .    end_takeco
33410 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41  nch:.      OSTRA
33420 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE(("TRANSPROXY:
33430 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70   CLOSE  %d\n", p
33440 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
33450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33460 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65  OK && pFile->ope
33470 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  nFlags ){.      
33480 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20    int fd;.      
33490 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
334a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
334b0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
334c0 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
334d0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
334e0 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  }.        pFile-
334f0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  >h = -1;.       
33500 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
33510 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
33520 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
33530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33540 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
33550 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
33560 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
33570 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
33580 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
33590 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
335a0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
335b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
335c0 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
335d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
335e0 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
335f0 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
33600 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
33610 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
33620 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
33630 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
33640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33650 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33660 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
33670 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
33680 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
33690 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
336a0 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
336b0 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
336c0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
336d0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
336e0 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
336f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
33700 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
33710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
33720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
33730 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
33740 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33750 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
33760 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
33770 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
33780 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
33790 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
337a0 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
337b0 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
337c0 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
337d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
337e0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
337f0 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
33800 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
33810 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
33820 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
33830 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
33840 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
33850 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
33860 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33890 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
338a0 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
338b0 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
338c0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
338d0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
338e0 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
338f0 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
33900 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
33910 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
33920 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
33930 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
33940 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
33950 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
33960 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
33970 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
33980 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
33990 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
339a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
339b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
339c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
339d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
339e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
339f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33a00 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
33a10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
33a20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
33a30 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
33a40 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
33a50 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
33a60 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
33a70 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
33a80 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
33a90 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
33aa0 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
33ab0 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
33ac0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
33ad0 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
33ae0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33af0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
33b00 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
33b10 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
33b20 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
33b30 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
33b40 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
33b50 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
33b60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
33b70 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
33b80 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
33bb0 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
33bc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33bd0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
33be0 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
33bf0 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
33c00 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
33c10 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
33c20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
33c30 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
33c40 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
33c50 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
33c60 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
33c70 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
33c80 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
33c90 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
33ca0 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
33cb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33cc0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
33cd0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33ce0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33cf0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33d00 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
33d10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33d20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33d30 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
33d40 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
33d50 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
33d60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
33d70 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
33d80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
33d90 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
33da0 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
33db0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33dc0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33dd0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
33de0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
33df0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
33e00 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
33e10 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
33e20 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
33e30 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33e40 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
33e50 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
33e60 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
33e70 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
33e80 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
33e90 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
33ea0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33eb0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33ec0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33ed0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33ee0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
33ef0 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
33f00 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
33f10 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33f20 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
33f30 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33f40 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
33f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
33f60 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
33f70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
33f90 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
33fa0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
33fb0 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
33fc0 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
33fd0 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33fe0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33ff0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
34000 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
34010 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
34020 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
34030 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
34040 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
34050 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
34060 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
34070 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
34080 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
34090 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
340a0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
340b0 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
340c0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
340d0 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
340e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
340f0 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
34100 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
34110 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
34120 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
34130 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
34140 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
34150 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
34160 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
34170 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
34180 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341a0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
341b0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
341c0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
341d0 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
341e0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
341f0 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
34200 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
34210 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
34220 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
34230 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
34240 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
34250 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
34260 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
34270 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
34280 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
34290 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
342a0 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
342b0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
342c0 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
342d0 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
342e0 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
342f0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
34300 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
34310 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
34320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34330 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
34340 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
34350 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
34360 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
34370 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
34380 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
34390 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
343a0 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
343b0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
343c0 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
343d0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
343e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
343f0 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
34400 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
34410 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
34420 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
34430 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
34440 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
34450 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
34460 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
34470 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
34480 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
34490 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
344a0 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
344b0 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
344c0 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
344d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
344e0 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
344f0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
34500 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
34510 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
34520 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
34530 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
34540 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
34550 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
34560 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
34570 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
34580 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34590 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
345a0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
345b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
345c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
345d0 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
345e0 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
345f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
34600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34610 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
34620 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34630 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34640 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34650 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
34660 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
34670 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
34680 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
34690 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
346a0 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
346b0 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
346c0 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
346d0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
346e0 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
346f0 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
34700 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
34710 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
34720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
34740 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34750 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
34760 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
34770 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
34780 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34790 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
347a0 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
347b0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
347c0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
347d0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
347e0 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
347f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34800 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
34820 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
34830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
34840 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
34850 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34860 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34870 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
34880 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
34890 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
348a0 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
348b0 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
348c0 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
348d0 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
348e0 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
348f0 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
34900 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
34910 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
34920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34930 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
34940 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
34950 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
34960 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
34970 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
34980 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
34990 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
349a0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
349b0 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
349c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
349d0 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
349e0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
349f0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
34a00 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
34a10 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
34a20 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
34a30 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
34a40 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
34a50 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
34a60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
34a70 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
34a80 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34a90 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34aa0 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
34ab0 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
34ac0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34ad0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34ae0 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
34af0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
34b00 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
34b10 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
34b20 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
34b30 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
34b40 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
34b50 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
34b60 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34b70 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
34b80 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
34b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
34ba0 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
34bb0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34bc0 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
34bd0 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
34be0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
34bf0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
34c00 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34c10 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
34c20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
34c30 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
34c40 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
34c50 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34c60 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
34c70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34c80 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34c90 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34ca0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34cb0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34cc0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34cd0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34ce0 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
34cf0 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
34d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34d10 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
34d20 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
34d30 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
34d40 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
34d50 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
34d60 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
34d70 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
34d80 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
34d90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
34da0 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
34db0 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
34dc0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
34dd0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
34de0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
34df0 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
34e00 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
34e10 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
34e20 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
34e30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
34e40 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
34e50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
34e60 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34e70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34e80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
34e90 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
34ea0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34eb0 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
34ec0 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
34ed0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34ef0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
34f00 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
34f10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34f20 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
34f30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34f40 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34f50 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34f60 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
34f70 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34f80 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
34f90 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
34fa0 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
34fb0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
34fc0 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
34fd0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34ff0 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
35000 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
35010 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
35020 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
35030 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
35040 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
35050 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
35060 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
35070 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
35080 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
35090 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
350a0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
350b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
350c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
350d0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
350e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
350f0 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
35100 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
35110 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
35120 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35130 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
35140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35150 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
35160 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
35170 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
35180 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
35190 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
351a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
351b0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
351c0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
351d0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
351e0 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
351f0 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
35200 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
35210 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
35220 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
35230 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
35240 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
35250 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
35260 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
35270 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
35280 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
35290 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
352a0 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
352b0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
352c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
352d0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
352e0 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
352f0 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
35300 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35310 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
35320 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
35330 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
35340 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
35350 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
35360 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
35370 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35380 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
35390 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
353a0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
353b0 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
353c0 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
353d0 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
353e0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
353f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
35400 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
35410 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
35420 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
35430 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
35440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35450 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
35460 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
35470 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
35480 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
35490 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
354a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
354b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
354c0 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
354d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
354e0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
354f0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35500 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
35510 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
35520 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
35530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35540 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
35550 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
35560 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
35570 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
35580 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
35590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
355a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
355b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
355c0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
355d0 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
355e0 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
355f0 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
35600 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
35610 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
35620 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
35630 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
35640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
35650 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
35660 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
35670 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
35680 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
35690 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
356a0 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
356b0 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
356c0 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
356d0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
356e0 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
356f0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
35700 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
35710 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
35720 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
35730 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
35740 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
35750 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
35760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
35770 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
35780 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
35790 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
357a0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
357b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
357c0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
357d0 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
357e0 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
357f0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
35800 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
35810 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
35820 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
35830 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
35840 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
35850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35860 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
35870 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
35880 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
35890 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
358a0 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
358b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
358c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
358d0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
358e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
358f0 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
35900 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
35910 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
35920 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
35930 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
35940 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
35950 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
35960 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
35970 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
35980 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
35990 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
359a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
359b0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
359c0 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
359d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
359e0 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
359f0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
35a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
35a10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
35a30 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
35a40 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
35a50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
35a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35a70 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35a80 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
35a90 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
35aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35ab0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
35ac0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35ad0 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
35ae0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
35af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
35b00 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35b10 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
35b20 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
35b30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
35b40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
35b50 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
35b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
35b70 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
35b80 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
35b90 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35ba0 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
35bb0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
35bc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35bd0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35be0 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
35bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35c00 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
35c10 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
35c20 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
35c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35c40 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
35c50 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
35c60 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
35c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35c80 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35c90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35ca0 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
35cb0 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
35cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
35d00 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
35d10 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
35d20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
35d30 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
35d40 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35d50 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
35d60 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
35d70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
35d80 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35d90 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
35da0 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
35db0 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
35dc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
35dd0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35de0 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
35df0 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
35e00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35e10 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
35e20 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
35e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35e50 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
35e60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35e70 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
35e80 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
35e90 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35ec0 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
35ed0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
35ee0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35ef0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
35f00 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
35f10 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
35f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35f30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35f40 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
35f50 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
35f60 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
35f70 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
35f80 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
35f90 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
35fa0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
35fb0 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
35fc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35fe0 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35ff0 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
36000 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
36010 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
36020 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
36030 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
36040 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
36050 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
36060 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
36070 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
36080 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
36090 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
360a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
360b0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
360c0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
360d0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
360e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
360f0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
36100 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
36110 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
36120 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
36130 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
36140 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
36150 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
36160 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
36170 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
36180 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
36190 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
361a0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
361b0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
361c0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
361d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
361e0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
361f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
36200 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
36210 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
36220 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
36230 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
36240 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
36250 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
36260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36270 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
36280 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36290 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
362a0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
362b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
362c0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
362d0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
362e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
362f0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
36300 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
36310 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
36320 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
36330 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
36340 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
36350 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
36360 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
36370 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
36380 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
36390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
363a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
363b0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
363c0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
363d0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
363e0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
363f0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
36400 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
36410 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
36420 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
36430 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
36440 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
36450 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
36460 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
36470 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
36480 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
36490 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
364a0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
364b0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
364c0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
364d0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
364e0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
364f0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
36500 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
36510 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
36520 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
36530 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
36540 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
36550 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
36560 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
36570 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
36580 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
36590 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
365a0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
365b0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
365c0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
365d0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
365e0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
365f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
36600 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
36610 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
36620 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
36630 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
36640 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
36650 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
36660 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36670 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
36680 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
36690 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
366a0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
366b0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
366c0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
366d0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
366e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
366f0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
36700 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
36710 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
36720 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
36730 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
36740 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
36750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36760 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36770 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36780 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36790 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
367a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
367b0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
367c0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
367d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
367e0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
367f0 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
36800 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
36810 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
36820 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
36830 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
36840 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
36850 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
36860 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
36870 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
36880 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
36890 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
368a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
368b0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
368c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
368d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
368e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
368f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
36900 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
36910 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
36920 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
36930 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
36940 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
36950 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36960 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
36970 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
36980 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
36990 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
369a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
369b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
369c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
369d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
369e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
369f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36a00 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
36a10 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
36a20 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36a40 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36a50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36a60 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36a70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36a80 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36a90 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36aa0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
36ab0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36ac0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36ad0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36ae0 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
36af0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36b00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
36b10 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
36b20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
36b30 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
36b40 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
36b50 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
36b60 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
36b70 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
36b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
36ba0 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
36bb0 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
36bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36bd0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
36be0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
36bf0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
36c00 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36c10 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
36c20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36c30 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36c40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36c50 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36c60 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
36c70 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
36c80 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
36c90 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
36ca0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36cb0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36cc0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
36cd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
36ce0 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
36cf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
36d00 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
36d10 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36d20 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
36d30 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
36d40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
36d60 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
36d70 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
36d80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
36d90 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
36da0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36db0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
36dc0 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
36dd0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
36de0 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
36df0 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
36e00 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
36e10 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36e20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
36e30 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
36e40 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
36e50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36e60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36e70 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
36e80 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36e90 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36ea0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
36eb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36ec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36ed0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
36ee0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
36ef0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
36f00 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
36f10 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
36f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36f30 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
36f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
36f50 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
36f60 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
36f70 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
36f80 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
36f90 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
36fa0 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
36fb0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
36fc0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
36fd0 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36fe0 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36ff0 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
37000 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
37010 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
37020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
37030 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
37040 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
37050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37060 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
37070 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
37080 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
37090 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
370a0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
370b0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
370c0 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
370d0 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
370e0 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
370f0 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
37100 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
37110 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
37120 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
37130 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
37140 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
37150 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
37160 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
37170 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
37180 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
37190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
371b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
37200 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
37210 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
37220 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
37230 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
37240 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
37250 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
37260 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
37270 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
37280 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
37290 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
372a0 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
372b0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
372c0 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
372d0 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
372e0 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
372f0 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
37300 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
37310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37320 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
37330 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
37340 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
37350 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
37360 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
37370 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37380 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
37390 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
373a0 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
373b0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
373c0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
373d0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
373e0 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
373f0 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
37400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
37410 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
37420 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
37430 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
37440 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
37450 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
37460 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
37470 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
37480 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
37490 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
374a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
374b0 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
374c0 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
374d0 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
374e0 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
374f0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
37500 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
37510 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
37520 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
37530 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
37540 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
37550 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
37560 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
37570 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
37580 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
37590 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
375a0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
375b0 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
375c0 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
375d0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
375e0 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
375f0 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
37600 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
37610 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
37620 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
37630 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
37640 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
37650 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
37660 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
37670 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
37680 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
37690 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
376a0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
376b0 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
376c0 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
376d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
376e0 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
376f0 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
37700 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
37710 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
37720 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
37730 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
37740 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
37750 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
37760 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37770 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
37780 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
37790 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
377a0 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
377b0 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
377c0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
377d0 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
377e0 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
377f0 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
37800 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
37810 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
37820 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
37830 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
37840 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
37850 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
37860 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
37870 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
37880 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378a0 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
378b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378c0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
378f0 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
37900 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37920 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
37930 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
37940 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37960 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
37970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
37980 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
37990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
379a0 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
379b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
379c0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
379d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
379e0 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
379f0 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
37a00 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
37a10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37a20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
37a30 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
37a40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37a50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37a60 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
37a70 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
37a80 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37a90 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37aa0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
37ab0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ad0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
37ae0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
37af0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
37b00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37b10 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
37b20 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
37b30 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
37b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b50 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
37b60 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
37b70 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
37b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37b90 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
37ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37bb0 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
37bc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37bd0 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
37be0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
37bf0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
37c00 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37c10 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
37c20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
37c30 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
37c40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37c50 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
37c60 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
37c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c80 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37c90 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
37ca0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
37cb0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37cc0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37cd0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
37ce0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
37cf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37d00 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
37d10 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
37d20 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
37d30 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
37d40 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
37d50 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37d60 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
37d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37d80 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
37d90 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
37da0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37db0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37dc0 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
37dd0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
37de0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37df0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
37e00 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
37e10 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
37e20 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
37e30 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
37e40 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
37e50 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
37e60 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
37e70 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
37e80 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
37e90 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
37ea0 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
37eb0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
37ec0 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
37ed0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
37ee0 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
37ef0 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
37f00 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
37f10 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
37f20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37f30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37f40 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
37f50 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
37f60 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
37f70 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37f80 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
37f90 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
37fa0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37fb0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
37fc0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37fd0 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37fe0 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37ff0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
38000 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
38010 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
38020 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
38030 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
38040 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
38050 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
38060 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
38070 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
38080 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
38090 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
380a0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
380b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
380c0 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
380d0 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
380e0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
380f0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
38100 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38110 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
38120 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
38130 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
38140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
38150 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
38160 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
38170 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
38180 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
38190 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
381a0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
381b0 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
381c0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
381d0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
381e0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
381f0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
38200 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
38210 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
38220 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
38230 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  /..  /* Double-c
38240 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
38250 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
38260 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
38270 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
38280 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
38290 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
382a0 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
382b0 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
382c0 61 6c 6c 29 3d 3d 31 38 20 29 3b 0a 0a 20 20 2f  all)==18 );..  /
382d0 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
382e0 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
382f0 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
38300 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
38310 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
38320 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
38330 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
38340 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
38350 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
38360 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
38370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
38380 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
38390 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
383a0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
383b0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
383c0 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
383d0 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
383e0 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
383f0 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
38400 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
38410 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
38420 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
38430 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
38440 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
38450 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
38460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
38470 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
38480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
38490 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
384a0 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
384b0 2a 2f 0a                                         */.