/ Hex Artifact Content
Login

Artifact 7a2e00cf63588096f356451b7405bf9c7316e1cd8543a7cfbe64e8ffed2e3f34:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69 66  s header..*/.#if
1130: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
1140: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
1150: 68 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a  hread.h>.#endif.
1160: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1170: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1180: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66  creating a new f
1190: 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ile.*/.#ifndef S
11a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
11b0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  LE_PERMISSIONS.#
11c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
11d0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
11e0: 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e  ISSIONS 0644.#en
11f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1200: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1210: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74  hen creating aut
1220: 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a 2f 0a 23  o proxy dir.*/.#
1230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1240: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
1250: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1260: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1270: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
1280: 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e  ISSIONS 0755.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
12a0: 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74  um supported pat
12b0: 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65  h-length..*/.#de
12c0: 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d  fine MAX_PATHNAM
12d0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  E 512../*.** Max
12e0: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 73  imum supported s
12f0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f  ymbolic links.*/
1300: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1310: 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 31 30 30  MAX_SYMLINKS 100
1320: 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73 74  ../* Always cast
1330: 20 74 68 65 20 67 65 74 70 69 64 28 29 20 72 65   the getpid() re
1340: 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63 6f  turn type for co
1350: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
1360: 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c  .** kernel modul
1370: 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 2a  es in VxWorks. *
1380: 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70  /.#define osGetp
1390: 69 64 28 58 29 20 28 70 69 64 5f 74 29 67 65 74  id(X) (pid_t)get
13a0: 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c  pid()../*.** Onl
13b0: 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72  y set the lastEr
13c0: 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  rno if the error
13d0: 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20   code is a real 
13e0: 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a  error and not .*
13f0: 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63  * a normal expec
1400: 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ted return code 
1410: 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  of SQLITE_BUSY o
1420: 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23  r SQLITE_OK.*/.#
1430: 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45  define IS_LOCK_E
1440: 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20  RROR(x)  ((x != 
1450: 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78  SQLITE_OK) && (x
1460: 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29   != SQLITE_BUSY)
1470: 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  )../* Forward re
1480: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65  ferences */.type
1490: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
14a0: 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20  hm unixShm;     
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
14c0: 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d  nection shared m
14d0: 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66  emory */.typedef
14e0: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
14f0: 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b  ode unixShmNode;
1500: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1510: 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65   memory instance
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
1540: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20   unixInodeInfo; 
1550: 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a    /* An i-node *
1560: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1570: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1580: 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20  ixUnusedFd;     
1590: 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c  /* An unused fil
15a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
15b0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
15c0: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
15d0: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
15e0: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
15f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1600: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1610: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1620: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1630: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1640: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1650: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
1660: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
1680: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
1690: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16a0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16b0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
16c0: 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  /.struct UnixUnu
16d0: 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64  sedFd {.  int fd
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1700: 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20  riptor to close 
1710: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1730: 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c  * Flags this fil
1740: 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73  e descriptor was
1750: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a   opened with */.
1760: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1770: 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e  pNext;      /* N
1780: 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20  ext unused file 
1790: 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61  descriptor on sa
17a0: 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  me file */.};../
17b0: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
17c0: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
17d0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
17e0: 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63  e3_file specific
17f0: 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20   to the unix.** 
1800: 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1810: 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ons..*/.typedef 
1820: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
1830: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
1840: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71   unixFile {.  sq
1850: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1860: 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b   const *pMethod;
1870: 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20    /* Always the 
1880: 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  first entry */. 
1890: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18a0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
18b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
18c0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
18d0: 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  s unixFile */.  
18e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
18f0: 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1900: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1910: 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20  t locks on this 
1920: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68  inode */.  int h
1930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1950: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
1960: 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  iptor */.  unsig
1970: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
1980: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck;            /
1990: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
19a0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
19b0: 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  fd */.  unsigned
19c0: 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c 46   short int ctrlF
19d0: 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 42  lags;       /* B
19e0: 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20  ehavioral bits. 
19f0: 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
1a00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45  s */.  int lastE
1a10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a30: 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f  e unix errno fro
1a40: 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  m last I/O error
1a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b   */.  void *lock
1a60: 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
1a80: 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69  king style speci
1a90: 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55  fic state */.  U
1aa0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 50 72  nixUnusedFd *pPr
1ab0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
1ac0: 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61  ;  /* Pre-alloca
1ad0: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1ae0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1af0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20   *zPath;        
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b10: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
1b20: 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d  .  unixShm *pShm
1b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1b50: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1b60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1b70: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1ba0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1bb0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1bc0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1bd0: 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63  ZE>0.  int nFetc
1be0: 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  hOut;           
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c00: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
1c10: 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 73 20  ing xFetch refs 
1c20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1c30: 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20  64 mmapSize;    
1c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62           /* Usab
1c50: 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  le size of mappi
1c60: 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e  ng at pMapRegion
1c70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1c80: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
1c90: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63 74  al;       /* Act
1ca0: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
1cb0: 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f  ing at pMapRegio
1cc0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1cd0: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
1cf0: 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d  nfigured FCNTL_M
1d00: 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a  MAP_SIZE value *
1d10: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
1d20: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1d30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1d40: 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  y mapped region 
1d50: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
1d60: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 44 65 76 69 63 65 20 73 65 63 74 6f 72  /* Device sector
1d90: 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64   size */.  int d
1da0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1db0: 74 69 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f  tics;          /
1dc0: 2a 20 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65  * Precomputed de
1dd0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1de0: 74 69 63 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49  tics */.#if SQLI
1df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1e00: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1e10: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e30: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1e40: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1e50: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1e60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1e70: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1e80: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1e90: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1ea0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1eb0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1ec0: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1ed0: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1ee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ef0: 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
1f00: 54 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 42 75  T.  unsigned iBu
1f10: 73 79 54 69 6d 65 6f 75 74 3b 20 20 20 20 20 20  syTimeout;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 69 74 20          /* Wait 
1f30: 74 68 69 73 20 6d 61 6e 79 20 6d 69 6c 6c 69 73  this many millis
1f40: 65 63 20 6f 6e 20 6c 6f 63 6b 73 20 2a 2f 0a 23  ec on locks */.#
1f50: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
1f60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
1f70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1f80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1f90: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1fa0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1fb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fc0: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
1fd0: 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  f variables are 
1fe0: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68  used to track wh
1ff0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2000: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2010: 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74  n counter in byt
2020: 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61  es 24-27 of data
2030: 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75  base files are u
2040: 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e  pdated.  ** when
2050: 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66  ever any part of
2060: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68   the database ch
2070: 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72  anges.  An asser
2080: 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a  tion fault will.
2090: 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20    ** occur if a 
20a0: 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
20b0: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64  without also upd
20c0: 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  ating the transa
20d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
20e0: 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69  er.  This test i
20f0: 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20  s made to avoid 
2100: 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d  new problems sim
2110: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
2120: 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62   one described b
2130: 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20  y ticket #3584. 
2140: 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  .  */.  unsigned
2150: 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43   char transCntrC
2160: 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  hng;   /* True i
2170: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2180: 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n counter change
2190: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
21a0: 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20  char dbUpdate;  
21b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21c0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74   any part of dat
21d0: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
21e0: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
21f0: 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72   char inNormalWr
2200: 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  ite;   /* True i
2210: 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72  f in a normal wr
2220: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ite operation */
2230: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ..#endif..#ifdef
2240: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2250: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
2260: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
2270: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
2280: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
2290: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
22a0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
22b0: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
22c0: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
22d0: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
22e0: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
22f0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20  dif.};../* This 
2300: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 74  variable holds t
2310: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 28 70  he process id (p
2320: 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20 74 68  id) from when th
2330: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a  e xRandomness().
2340: 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20 63 61  ** method was ca
2350: 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65 6e 28  lled.  If xOpen(
2360: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
2370: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
2380: 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69  cess id,.** indi
2390: 63 61 74 69 6e 67 20 74 68 61 74 20 61 20 66 6f  cating that a fo
23a0: 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72 72 65  rk() has occurre
23b0: 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69 6c 6c  d, the PRNG will
23c0: 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74   be reset..*/.st
23d0: 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e 64 6f  atic pid_t rando
23e0: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
23f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2400: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2410: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2420: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
2430: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
2440: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
2450: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
2460: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
2470: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2480: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2490: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
24a0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
24b0: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
24c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
24d0: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
24e0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
24f0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2510: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2520: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2530: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
2540: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
2550: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
2560: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
2570: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2580: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2590: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
25a0: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
25b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
25c0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
25d0: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
25e0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
25f0: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2600: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2610: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2620: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
2630: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
2640: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
2650: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
2660: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
2670: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
2680: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2690: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
26a0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ng */../*.** Inc
26b0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
26c0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
26d0: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
26e0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
26f0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
2700: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
2710: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
2720: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
2730: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
2740: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2760: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2770: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2780: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2790: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
27a0: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
27b0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27c0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
27d0: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
27e0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27f0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
2800: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
2810: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2820: 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72  threadid macro r
2830: 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74  esolves to the t
2840: 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30  hread-id or to 0
2850: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74  .  Used for.** t
2860: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2870: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
2880: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
2890: 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65  AFE.#define thre
28a0: 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c  adid pthread_sel
28b0: 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  f().#else.#defin
28c0: 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e  e threadid 0.#en
28d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f  dif../*.** HAVE_
28e0: 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20  MREMAP defaults 
28f0: 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78  to true on Linux
2900: 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79   and false every
2910: 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23  where else..*/.#
2920: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
2930: 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65  _MREMAP).# if de
2940: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
2950: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55   && defined(_GNU
2960: 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69  _SOURCE).#  defi
2970: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31  ne HAVE_MREMAP 1
2980: 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  .# else.#  defin
2990: 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a  e HAVE_MREMAP 0.
29a0: 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
29b0: 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c 79  /*.** Explicitly
29c0: 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69 74   call the 64-bit
29d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65 65   version of lsee
29e0: 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e 20  k() on Android. 
29f0: 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65 6b  Otherwise, lseek
2a00: 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32 2d  ().** is the 32-
2a10: 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76 65  bit version, eve
2a20: 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45  n if _FILE_OFFSE
2a30: 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65 66  T_BITS=64 is def
2a40: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ined..*/.#ifdef 
2a50: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64 65  __ANDROID__.# de
2a60: 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65 6b  fine lseek lseek
2a70: 36 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  64.#endif..#ifde
2a80: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
2a90: 2a 20 4c 69 6e 75 78 2d 73 70 65 63 69 66 69 63  * Linux-specific
2aa0: 20 49 4f 43 54 4c 20 6d 61 67 69 63 20 6e 75 6d   IOCTL magic num
2ab0: 62 65 72 73 20 75 73 65 64 20 66 6f 72 20 63 6f  bers used for co
2ac0: 6e 74 72 6f 6c 6c 69 6e 67 20 46 32 46 53 0a 2a  ntrolling F2FS.*
2ad0: 2f 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  /.#define F2FS_I
2ae0: 4f 43 54 4c 5f 4d 41 47 49 43 20 20 20 20 20 20  OCTL_MAGIC      
2af0: 20 20 30 78 66 35 0a 23 64 65 66 69 6e 65 20 46    0xf5.#define F
2b00: 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54  2FS_IOC_START_AT
2b10: 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20 20 5f  OMIC_WRITE     _
2b20: 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  IO(F2FS_IOCTL_MA
2b30: 47 49 43 2c 20 31 29 0a 23 64 65 66 69 6e 65 20  GIC, 1).#define 
2b40: 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
2b50: 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20  ATOMIC_WRITE    
2b60: 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d  _IO(F2FS_IOCTL_M
2b70: 41 47 49 43 2c 20 32 29 0a 23 64 65 66 69 6e 65  AGIC, 2).#define
2b80: 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
2b90: 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20 20  VOLATILE_WRITE  
2ba0: 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f   _IO(F2FS_IOCTL_
2bb0: 4d 41 47 49 43 2c 20 33 29 0a 23 64 65 66 69 6e  MAGIC, 3).#defin
2bc0: 65 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54  e F2FS_IOC_ABORT
2bd0: 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20  _VOLATILE_WRITE 
2be0: 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c    _IO(F2FS_IOCTL
2bf0: 5f 4d 41 47 49 43 2c 20 35 29 0a 23 64 65 66 69  _MAGIC, 5).#defi
2c00: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f  ne F2FS_IOC_GET_
2c10: 46 45 41 54 55 52 45 53 20 20 20 20 20 20 20 20  FEATURES        
2c20: 20 20 20 5f 49 4f 52 28 46 32 46 53 5f 49 4f 43     _IOR(F2FS_IOC
2c30: 54 4c 5f 4d 41 47 49 43 2c 20 31 32 2c 20 75 33  TL_MAGIC, 12, u3
2c40: 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  2).#define F2FS_
2c50: 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f 57  FEATURE_ATOMIC_W
2c60: 52 49 54 45 20 30 78 30 30 30 34 0a 23 65 6e 64  RITE 0x0004.#end
2c70: 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20  if /* __linux__ 
2c80: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  */.../*.** Diffe
2c90: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2ca0: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2cb0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2cc0: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2cd0: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2ce0: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2cf0: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2d00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2d10: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
2d20: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
2d30: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
2d40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2d50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2d60: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
2d70: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2d80: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2d90: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2da0: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2db0: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2dc0: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2dd0: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2df0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2e00: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2e10: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
2e20: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
2e30: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2e70: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2e80: 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69   int*);.static i
2e90: 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69  nt unixGetpagesi
2ea0: 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a  ze(void);../*.**
2eb0: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
2ec0: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
2ed0: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
2ee0: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
2ef0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
2f00: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
2f10: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
2f20: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
2f30: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
2f40: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
2f50: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
2f60: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
2f70: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
2f80: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
2f90: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
2fa0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
2fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2fc0: 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b  t unix_syscall {
2fd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fe0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
2ff0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3000: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
3010: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3020: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
3030: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
3040: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
3050: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
3060: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
3070: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
3080: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
3090: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
30a0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
30b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
30c0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
30d0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
30e0: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
30f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3100: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
3110: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
3120: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
3130: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3140: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
3150: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3160: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
3170: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
3180: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
3190: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
31a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
31b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
31c0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
31d0: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
31e0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
31f0: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
3200: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3210: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
3220: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3230: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
3240: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
3250: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
3260: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
3270: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
3280: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3290: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
32a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
32b0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
32c0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
32d0: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
32e0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
32f0: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
3300: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
3310: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
3320: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
3330: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
3340: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
3350: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
3360: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
3370: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
3380: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
3390: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
33a0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
33b0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
33c0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
33d0: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
33e0: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
33f0: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
3400: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
3410: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
3420: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
3430: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3440: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3450: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
3460: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
3470: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
3480: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
3490: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
34a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
34b0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
34c0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
34d0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
34e0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
34f0: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3500: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
3510: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
3520: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3530: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
3540: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3550: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
3560: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
3570: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
3580: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
3590: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
35c0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
35d0: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
35e0: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
35f0: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3600: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3610: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3620: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3630: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3640: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3650: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3660: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
3670: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
3680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3690: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
36a0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
36b0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
36c0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
36d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
36e0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
36f0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3700: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3710: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3720: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3730: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3740: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3750: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3760: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3770: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
3780: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
3790: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
37a0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
37b0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
37c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37d0: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
37e0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
37f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3800: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3810: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3820: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3830: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 28  fine osPread64 (
3840: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3850: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3860: 36 34 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  64_t))aSyscall[1
3870: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
3880: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
3890: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
38a0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
38b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
38c0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
38d0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
38e0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
38f0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3900: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3910: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3920: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3930: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3940: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3950: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3960: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3970: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
3980: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3990: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
39a0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
39b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
39c0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
39d0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
39e0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
39f0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3a00: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3a10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a20: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3a30: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3a40: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3a50: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3a60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3a70: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
3a80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3a90: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
3aa0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ab0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3ac0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3ad0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3ae0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3af0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3b00: 65 5f 74 2c 6f 66 66 36 34 5f 74 29 29 5c 0a 20  e_t,off64_t))\. 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
3b30: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3b40: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3b50: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b60: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3b70: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3b80: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
3b90: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
3ba0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
3bb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3bc0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3bd0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3be0: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3bf0: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3c00: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3c10: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3c20: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
3c30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3c40: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3c50: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3c60: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c80: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3c90: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3ca0: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3cb0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3cc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3cd0: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3cf0: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3d00: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3d10: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3d20: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d30: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
3d40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d50: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
3d60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3d70: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
3d80: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3d90: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3da0: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3db0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3dc0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3de0: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3df0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3e00: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3e10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3e20: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3e30: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3e40: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3e50: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3e60: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3e70: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3e80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3e90: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3ea0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3eb0: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3ec0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3ed0: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3ee0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3ef0: 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20  (HAVE_FCHOWN).  
3f00: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3f10: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3f20: 6c 6c 5f 70 74 72 29 66 63 68 6f 77 6e 2c 20 20  ll_ptr)fchown,  
3f30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3f40: 73 65 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  se.  { "fchown",
3f50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3f60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3f80: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3f90: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3fa0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3fb0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3fc0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  20].pCurrent)..#
3fd0: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
3fe0: 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 67 65 74  FCHOWN).  { "get
3ff0: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4000: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4010: 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20 20  )geteuid,       
4020: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4030: 20 22 67 65 74 65 75 69 64 22 2c 20 20 20 20 20   "geteuid",     
4040: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4050: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4060: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4070: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  if.#define osGet
4080: 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a  euid   ((uid_t(*
4090: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
40a0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
40b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
40c0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
40d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
40e0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
40f0: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4100: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4110: 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  )mmap,          
4120: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4130: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
4140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4150: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4160: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4170: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  if.#define osMma
4180: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
4190: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
41a0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
41b0: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
41c0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
41d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
41e0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
41f0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
4200: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
4210: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4220: 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20  l_ptr)munmap,   
4230: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4240: 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  e.  { "munmap", 
4250: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
4260: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4280: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4290: 6f 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a  osMunmap ((int(*
42a0: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  )(void*,size_t))
42b0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
42c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45  rrent)..#if HAVE
42d0: 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66  _MREMAP && (!def
42e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
42f0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4300: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
4310: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
4320: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4330: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
4340: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
4350: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
4360: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
4370: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4390: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
43a0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
43b0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
43c0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
43d0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34  ...))aSyscall[24
43e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
43f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4400: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
4410: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
4420: 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67  ZE>0.  { "getpag
4430: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
4440: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
4450: 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30  ixGetpagesize, 0
4460: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67   },.#else.  { "g
4470: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
4480: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4490: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
44a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67  #define osGetpag
44c0: 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76  esize ((int(*)(v
44d0: 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  oid))aSyscall[25
44e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
44f0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45   defined(HAVE_RE
4500: 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61  ADLINK).  { "rea
4510: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
4520: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4530: 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20  )readlink,      
4540: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4550: 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20   "readlink",    
4560: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4570: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4580: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4590: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  if.#define osRea
45a0: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
45b0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
45c0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
45d0: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
45e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
45f0: 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b  (HAVE_LSTAT).  {
4600: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
4610: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4620: 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20  ll_ptr)lstat,   
4630: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4640: 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20  e.  { "lstat",  
4650: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4660: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4680: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4690: 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69  osLstat      ((i
46a0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
46b0: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
46c0: 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75  aSyscall[27].pCu
46d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
46e0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
46f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4700: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
4710: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 23 20 69 66  OMIC_WRITE).# if
4720: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
4730: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 28 73 71    { "ioctl", (sq
4740: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4750: 72 29 28 69 6e 74 28 2a 29 28 69 6e 74 2c 20 69  r)(int(*)(int, i
4760: 6e 74 2c 20 2e 2e 2e 29 29 69 6f 63 74 6c 2c 20  nt, ...))ioctl, 
4770: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 49  0 },.#define osI
4780: 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e  octl ((int(*)(in
4790: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
47a0: 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74  all[28].pCurrent
47b0: 29 0a 23 20 65 6c 73 65 0a 20 20 7b 20 22 69 6f  ).# else.  { "io
47c0: 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73  ctl",         (s
47d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
47e0: 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20  tr)ioctl,       
47f0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
4800: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
4810: 28 69 6e 74 2c 75 6e 73 69 67 6e 65 64 20 6c 6f  (int,unsigned lo
4820: 6e 67 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  ng,...))aSyscall
4830: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [28].pCurrent).#
4840: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b   endif.#else.  {
4850: 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20   "ioctl",       
4860: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4870: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
4880: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4890: 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  if..}; /* End of
48a0: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
48b0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
48c0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d  /.../*.** On som
48d0: 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73  e systems, calls
48e0: 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c   to fchown() wil
48f0: 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73  l trigger a mess
4900: 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74  age in a securit
4910: 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79  y.** log if they
4920: 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72   come from non-r
4930: 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20  oot processes.  
4940: 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67  So avoid calling
4950: 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20   fchown() if.** 
4960: 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
4970: 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73  ng as root..*/.s
4980: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4990: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
49a0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
49b0: 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  gid){.#if define
49c0: 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20  d(HAVE_FCHOWN). 
49d0: 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69   return osGeteui
49e0: 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f  d() ? 0 : osFcho
49f0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
4a00: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
4a10: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
4a20: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
4a30: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
4a40: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
4a50: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
4a60: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
4a70: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
4a80: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
4a90: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
4aa0: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
4ab0: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
4ac0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4ad0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
4ae0: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
4af0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4b00: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
4b10: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
4b20: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
4b30: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
4b40: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
4b50: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
4b60: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
4b70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
4b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4b90: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
4ba0: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
4bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4bc0: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
4bd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
4be0: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
4bf0: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
4c00: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
4c10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
4c20: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
4c30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
4c40: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
4c50: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
4c60: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
4c70: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
4c80: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
4c90: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
4ca0: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
4cb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4cc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
4cd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4ce0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4cf0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4d00: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4d10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4d20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4d30: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
4d40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4d50: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
4d60: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
4d70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
4d80: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
4d90: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
4da0: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4db0: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4dc0: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4dd0: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4de0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4df0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4e00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4e10: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4e20: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4e30: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4e40: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
4e50: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4e60: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
4e70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
4e80: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4e90: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4ea0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4ec0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4ed0: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4ee0: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4ef0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4f00: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4f10: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4f20: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4f30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4f50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4f70: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
4f80: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
4f90: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
4fa0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4fb0: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4fc0: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4fd0: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4fe0: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4ff0: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
5000: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
5010: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
5020: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
5030: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
5040: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
5050: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
5060: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
5070: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
5080: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5090: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
50a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
50b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
50c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
50d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
50e0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
50f0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5100: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
5110: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5120: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
5130: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5140: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5150: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5160: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
5170: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
5180: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
5190: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
51a0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
51b0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
51c0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
51d0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
51e0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
51f0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
5200: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
5210: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
5220: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5230: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
5240: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
5250: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
5260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
5270: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
5280: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
5290: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
52a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
52b0: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
52c0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
52d0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
52e0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
52f0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
5300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
5310: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
5320: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
5330: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
5340: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5350: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
5360: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
5370: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5380: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  }../*.** Do not 
5390: 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20  accept any file 
53a0: 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20  descriptor less 
53b0: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
53c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
53d0: 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61  id.** opening da
53e0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
53f0: 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  g file descripto
5400: 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  rs that are comm
5410: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a  only used for .*
5420: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
5430: 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72  , output, and er
5440: 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ror..*/.#ifndef 
5450: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
5460: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23  ILE_DESCRIPTOR.#
5470: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
5480: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
5490: 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a  RIPTOR 3.#endif.
54a0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70  ./*.** Invoke op
54b0: 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c  en().  Do so mul
54c0: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74  tiple times, unt
54d0: 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63  il it either suc
54e0: 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c  ceeds or.** fail
54f0: 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f  s for some reaso
5500: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e  n other than EIN
5510: 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  TR..**.** If the
5520: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
5530: 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65  ode "m" is 0 the
5540: 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  n set it to the 
5550: 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53  default for.** S
5560: 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61  QLite.  The defa
5570: 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45  ult is SQLITE_DE
5580: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
5590: 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79  SSIONS (normally
55a0: 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64  .** 0644) as mod
55b0: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73  ified by the sys
55c0: 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d  tem umask.  If m
55d0: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a   is not 0, then.
55e0: 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
55f0: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62   creation mode b
5600: 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f  e exactly m igno
5610: 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a  ring the umask..
5620: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61  **.** The m para
5630: 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f  meter will be no
5640: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e  n-zero only when
5650: 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20   creating -wal, 
5660: 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64  -journal,.** and
5670: 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65   -shm files.  We
5680: 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65   want those file
5690: 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74  s to have *exact
56a0: 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ly* the same.** 
56b0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74  permissions as t
56c0: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
56d0: 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65  tabase, unadulte
56e0: 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  rated by the uma
56f0: 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77  sk..** In that w
5700: 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73  ay, if a databas
5710: 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77  e file is -rw-rw
5720: 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d  -rw or -rw-rw-r-
5730: 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73  , and a.** trans
5740: 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61  action crashes a
5750: 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64  nd leaves behind
5760: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   hot journals, t
5770: 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65  hen any.** proce
5780: 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20  ss that is able 
5790: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
57a0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c  database will al
57b0: 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a  so be able to.**
57c0: 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74   recover the hot
57d0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74   journals..*/.st
57e0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
57f0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
5800: 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f  *z, int f, mode_
5810: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  t m){.  int fd;.
5820: 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20    mode_t m2 = m 
5830: 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46  ? m : SQLITE_DEF
5840: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5850: 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31  SIONS;.  while(1
5860: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ){.#if defined(O
5870: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
5880: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
5890: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
58a0: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
58b0: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
58c0: 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  if.    if( fd<0 
58d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
58e0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74  no==EINTR ) cont
58f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
5900: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
5910: 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49   fd>=SQLITE_MINI
5920: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
5930: 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  TOR ) break;.   
5940: 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20   osClose(fd);.  
5950: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5960: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20  LITE_WARNING, . 
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5980: 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  attempt to open 
5990: 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64  \"%s\" as file d
59a0: 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a  escriptor %d", z
59b0: 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20  , fd);.    fd = 
59c0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70  -1;.    if( osOp
59d0: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
59e0: 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b  f, m)<0 ) break;
59f0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30  .  }.  if( fd>=0
5a00: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
5a10: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5a20: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
5a30: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
5a40: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
5a50: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
5a60: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
5a70: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
5a80: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
5a90: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
5aa0: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
5ab0: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
5ac0: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
5ad0: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
5ae0: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
5af0: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
5b00: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
5b10: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
5b20: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
5b30: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
5b40: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
5b50: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
5b60: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
5b70: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
5b80: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
5b90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5ba0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
5bb0: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
5bc0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
5bd0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
5be0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
5bf0: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
5c00: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
5c10: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
5c20: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
5c30: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
5c40: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
5c50: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
5c60: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
5c70: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
5c80: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
5c90: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
5ca0: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
5cb0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
5cc0: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
5cd0: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
5ce0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
5cf0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
5d00: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
5d10: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5d20: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
5d30: 72 4c 65 61 76 65 28 29 0a 2a 2a 0a 2a 2a 20 54  rLeave().**.** T
5d40: 6f 20 70 72 65 76 65 6e 74 20 64 65 61 64 6c 6f  o prevent deadlo
5d50: 63 6b 2c 20 74 68 65 20 67 6c 6f 62 61 6c 20 75  ck, the global u
5d60: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20  nixBigLock must 
5d70: 6d 75 73 74 20 62 65 20 61 63 71 75 69 72 65 64  must be acquired
5d80: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 75  .** before the u
5d90: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2e 70 4c 6f  nixInodeInfo.pLo
5da0: 63 6b 4d 75 74 65 78 20 6d 75 74 65 78 2c 20 69  ckMutex mutex, i
5db0: 66 20 62 6f 74 68 20 61 72 65 20 68 65 6c 64 2e  f both are held.
5dc0: 20 20 49 74 20 69 73 0a 2a 2a 20 4f 4b 20 74 6f    It is.** OK to
5dd0: 20 67 65 74 20 74 68 65 20 70 4c 6f 63 6b 4d 75   get the pLockMu
5de0: 74 65 78 20 77 69 74 68 6f 75 74 20 68 6f 6c 64  tex without hold
5df0: 69 6e 67 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20  ing unixBigLock 
5e00: 66 69 72 73 74 2c 20 62 75 74 20 69 66 0a 2a 2a  first, but if.**
5e10: 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
5e20: 68 65 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d  he unixBigLock m
5e30: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 62 65  utex must not be
5e40: 20 61 63 71 75 69 72 65 64 20 75 6e 74 69 6c 20   acquired until 
5e50: 61 66 74 65 72 0a 2a 2a 20 70 4c 6f 63 6b 4d 75  after.** pLockMu
5e60: 74 65 78 20 69 73 20 72 65 6c 65 61 73 65 64 2e  tex is released.
5e70: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4f 4b 3a 20  .**.**      OK: 
5e80: 20 20 20 20 65 6e 74 65 72 28 75 6e 69 78 42 69      enter(unixBi
5e90: 67 4c 6f 63 6b 29 2c 20 20 65 6e 74 65 72 28 70  gLock),  enter(p
5ea0: 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 20  LockInfo).**    
5eb0: 20 20 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28    OK:     enter(
5ec0: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a 2a 20  unixBigLock).** 
5ed0: 20 20 20 20 20 4f 4b 3a 20 20 20 20 20 65 6e 74       OK:     ent
5ee0: 65 72 28 70 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a  er(pLockInfo).**
5ef0: 20 20 20 45 52 52 4f 52 3a 20 20 20 20 20 65 6e     ERROR:     en
5f00: 74 65 72 28 70 4c 6f 63 6b 49 6e 66 6f 29 2c 20  ter(pLockInfo), 
5f10: 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63  enter(unixBigLoc
5f20: 6b 29 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  k).*/.static sql
5f30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 75 6e 69 78  ite3_mutex *unix
5f40: 42 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a 73 74 61  BigLock = 0;.sta
5f50: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
5f60: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
5f70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5f80: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 75  _mutex_notheld(u
5f90: 6e 69 78 42 69 67 4c 6f 63 6b 29 20 29 3b 20 20  nixBigLock) );  
5fa0: 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69  /* Not a recursi
5fb0: 76 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 73 71  ve mutex */.  sq
5fc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5fd0: 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a  r(unixBigLock);.
5fe0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
5ff0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
6000: 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  d){.  assert( sq
6010: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6020: 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 20 29 3b  (unixBigLock) );
6030: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6040: 5f 6c 65 61 76 65 28 75 6e 69 78 42 69 67 4c 6f  _leave(unixBigLo
6050: 63 6b 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  ck);.}.#ifdef SQ
6060: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
6070: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
6080: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
6090: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
60a0: 65 78 5f 68 65 6c 64 28 75 6e 69 78 42 69 67 4c  ex_held(unixBigL
60b0: 6f 63 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ock);.}.#endif..
60c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
60d0: 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a  AVE_OS_TRACE./*.
60e0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
60f0: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
6100: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
6110: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
6120: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
6130: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
6140: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
6150: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
6160: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
6170: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
6180: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6190: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
61a0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
61b0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
61c0: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
61d0: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
61e0: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
61f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
6200: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
6210: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
6220: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
6230: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
6240: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
6250: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
6260: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
6270: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
6280: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
6290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
62a0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
62b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
62c0: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
62d0: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
62e0: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
62f0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
6300: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
6310: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
6320: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
6330: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
6340: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
6350: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
6360: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
6370: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
6380: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
6390: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
63a0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
63b0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
63c0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
63d0: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
63e0: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
63f0: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
6400: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
6410: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
6420: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
6430: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
6440: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
6450: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
6460: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
6470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
6480: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
6490: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
64a0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
64b0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
64c0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
64d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
64e0: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
64f0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
6500: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
6510: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
6520: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
6530: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
6540: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
6550: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
6560: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
6570: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
6580: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
6590: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
65a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
65b0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
65c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
65d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
65e0: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
65f0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
6600: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
6610: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
6620: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
6630: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
6640: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
6650: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
6660: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
6670: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
6680: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
6690: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
66a0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
66b0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
66c0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
66d0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
66e0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
66f0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
6700: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
6710: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
6720: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
6730: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
6740: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
6750: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
6760: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
6770: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
6780: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
6790: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
67a0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
67b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
67c0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
67d0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
67e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
67f0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
6800: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
6810: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
6820: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
6830: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
6840: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
6850: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
6860: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
6870: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
6880: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
6890: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
68a0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
68b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
68c0: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
68d0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
68e0: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
68f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
6900: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
6910: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
6920: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
6930: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a  ue to EINTR.**.*
6940: 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66  * All calls to f
6950: 74 72 75 6e 63 61 74 65 28 29 20 77 69 74 68 69  truncate() withi
6960: 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75  n this file shou
6970: 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75  ld be made throu
6980: 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70  gh.** this wrapp
6990: 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72  er.  On the Andr
69a0: 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79  oid platform, by
69b0: 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69  passing the logi
69c0: 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64  c below.** could
69d0: 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75   lead to a corru
69e0: 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  pt database..*/.
69f0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
6a00: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
6a10: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
6a20: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
6a30: 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44  #ifdef __ANDROID
6a40: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f  __.  /* On Andro
6a50: 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20  id, ftruncate() 
6a60: 61 6c 77 61 79 73 20 75 73 65 73 20 33 32 2d 62  always uses 32-b
6a70: 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e  it offsets, even
6a80: 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f   if .  ** _FILE_
6a90: 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69  OFFSET_BITS=64 i
6aa0: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
6ab0: 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61  means it is unsa
6ac0: 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  fe to attempt to
6ad0: 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  .  ** truncate a
6ae0: 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a   file to any siz
6af0: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47  e larger than 2G
6b00: 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e  iB. Silently ign
6b10: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ore any.  ** suc
6b20: 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a  h attempts.  */.
6b30: 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65    if( sz>(sqlite
6b40: 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46 46 46  3_int64)0x7FFFFF
6b50: 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  FF ){.    rc = S
6b60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
6b70: 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72  e.#endif.  do{ r
6b80: 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28  c = osFtruncate(
6b90: 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72  h,sz); }while( r
6ba0: 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
6bb0: 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
6bc0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
6bd0: 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c  s routine transl
6be0: 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20  ates a standard 
6bf0: 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65  POSIX errno code
6c00: 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a   into something.
6c10: 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65  ** useful to the
6c20: 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20   clients of the 
6c30: 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e  sqlite3 function
6c40: 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
6c50: 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e  , it is.** inten
6c60: 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  ded to translate
6c70: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74   a variety of "t
6c80: 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73  ry again" errors
6c90: 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53   into SQLITE_BUS
6ca0: 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65  Y.** and a varie
6cb0: 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c  ty of "please cl
6cc0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
6cd0: 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72  criptor NOW" err
6ce0: 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c  ors into .** SQL
6cf0: 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a  ITE_IOERR.** .**
6d00: 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69   Errors during i
6d10: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
6d20: 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20   locks, or file 
6d30: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66  system support f
6d40: 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f  or locks,.** sho
6d50: 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43  uld handle ENOLC
6d60: 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e  K, ENOTSUP, EOPN
6d70: 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c  OTSUPP separatel
6d80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
6d90: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
6da0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70  PosixError(int p
6db0: 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73  osixError, int s
6dc0: 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20  qliteIOErr) {.  
6dd0: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 49  assert( (sqliteI
6de0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6df0: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20  OERR_LOCK) || . 
6e00: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
6e10: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
6e20: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
6e30: 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c   .          (sql
6e40: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6e50: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
6e60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73   ||.          (s
6e70: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
6e80: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
6e90: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b  RESERVEDLOCK) );
6ea0: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
6eb0: 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20  Error) {.  case 
6ec0: 45 41 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20  EACCES: .  case 
6ed0: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
6ee0: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
6ef0: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
6f00: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
6f10: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
6f20: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
6f30: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
6f40: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6f50: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6f60: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6f70: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6f80: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6f90: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
6fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6fb0: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 50  ;.    .  case EP
6fc0: 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ERM: .    return
6fd0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
6fe0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
6ff0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7000: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  IOErr;.  }.}.../
7010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7070: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
7080: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
7090: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
70a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
70b0: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
70c0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
70d0: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
70e0: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
70f0: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
7100: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
7110: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
7120: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
7130: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
7140: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
7150: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
7160: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
7170: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
7180: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
7190: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
71a0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
71b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
71c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
71d0: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
71e0: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
71f0: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
7200: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
7210: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
7220: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
7230: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
7240: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7250: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
7260: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
7270: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
7280: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
7290: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
72a0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
72b0: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
72c0: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
72d0: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
72e0: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
72f0: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
7300: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
7310: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
7320: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
7330: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
7340: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
7350: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
7360: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
7370: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
7380: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
7390: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
73a0: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
73b0: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
73c0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
73d0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
73f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
7400: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
7410: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
7440: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
7450: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
7460: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
7470: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
7480: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
7490: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
74a0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
74b0: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
74c0: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
74d0: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
74e0: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
74f0: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
7500: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
7510: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7520: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7530: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
7540: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
7550: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
7560: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
7570: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
7580: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
7590: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
75a0: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
75b0: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
75c0: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
75d0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
75e0: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
75f0: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
7600: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
7610: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
7620: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
7630: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
7640: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
7650: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
7660: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
7670: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
7680: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7690: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
76a0: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
76b0: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
76c0: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
76d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
76e0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
76f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
7700: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
7710: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
7720: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
7730: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
7740: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
7750: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
7760: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
7770: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7780: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
7790: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
77a0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
77b0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
77c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
77d0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
77e0: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
77f0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
7800: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
7810: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
7820: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
7830: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
7840: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
7850: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
7860: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7870: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
7880: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
7890: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
78a0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
78b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
78c0: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
78d0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
78e0: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
78f0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
7900: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
7910: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7920: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
7930: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
7940: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
7950: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
7960: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
7970: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
7980: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
7990: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
79a0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
79b0: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
79c0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
79d0: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
79e0: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
79f0: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
7a00: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
7a10: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
7a20: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
7a30: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
7a40: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
7a50: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
7a60: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
7a70: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
7a80: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
7a90: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7aa0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
7ab0: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
7ac0: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7ad0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7ae0: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
7af0: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
7b00: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
7b10: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
7b20: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7b50: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
7b60: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
7b70: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
7b80: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
7b90: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
7ba0: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
7bb0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
7bc0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
7bd0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
7be0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7bf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7c00: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7c10: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
7c20: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
7c30: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7c40: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
7c50: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
7c60: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7c70: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
7c80: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
7c90: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
7ca0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
7cb0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
7cc0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
7cd0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
7ce0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
7cf0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7d00: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
7d10: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
7d20: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7d30: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
7d40: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
7d50: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
7d60: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
7d70: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
7d80: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
7d90: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
7da0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
7db0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
7dc0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
7dd0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7de0: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
7df0: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
7e00: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
7e10: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
7e20: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
7e30: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
7e40: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7e50: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
7e60: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
7e70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
7e80: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
7e90: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
7ea0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
7eb0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
7ec0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
7ed0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
7ee0: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
7ef0: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
7f00: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
7f10: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7f20: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
7f30: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
7f40: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7f50: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
7f60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7f70: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
7f80: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
7f90: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7fa0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
7fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7fc0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
7fd0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
7fe0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
7ff0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
8000: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
8010: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
8020: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
8030: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
8040: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
8050: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
8060: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
8070: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
8080: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
8090: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
80a0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
80b0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
80c0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
80d0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
80e0: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
80f0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
8100: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
8110: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
8120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
8130: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
8140: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
8150: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
81c0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
8230: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
8240: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
8250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8260: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
8270: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
8280: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
8290: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
82a0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
82b0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
82c0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
82d0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
82e0: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
82f0: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
8300: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
8310: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
8320: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
8330: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
8340: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
8350: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
8360: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
8370: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
8380: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
8390: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
83a0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
83b0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
83c0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
83d0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
83e0: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
83f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
8400: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
8410: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
8420: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
8430: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
8440: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
8450: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
8460: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
8470: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
8480: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
8490: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
84a0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
84b0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
84c0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
84d0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
84e0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
84f0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
8500: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
8510: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
8520: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
8530: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
8540: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
8550: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
8560: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
8570: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
8580: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
8590: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
85a0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
85b0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
85c0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
85d0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
85e0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
85f0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
8600: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
8610: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
8620: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
8630: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8640: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
8650: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
8660: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
8670: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
8680: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
8690: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
86a0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
86b0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
86c0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
86d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
86e0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
86f0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
8700: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
8710: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
8720: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
8730: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
8740: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
8750: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
8760: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
8770: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
8780: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
8790: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
87a0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
87b0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
87c0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
87d0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
87e0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
87f0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
8800: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
8810: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
8820: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
8830: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
8840: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
8850: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
8860: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
8870: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
8880: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
8890: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
88a0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
88b0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
88c0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
88d0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
88e0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
88f0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
8900: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
8910: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
8920: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
8930: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
8940: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
8950: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
8960: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
8970: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
8980: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
8990: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
89a0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
89b0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
89c0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
89d0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
89e0: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
89f0: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
8a00: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
8a10: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
8a20: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
8a30: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
8a40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
8a50: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
8a60: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
8a70: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
8a80: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8a90: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
8aa0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
8ab0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
8ac0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
8ad0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
8ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8af0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8b00: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
8b10: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
8b20: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
8b30: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
8b40: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
8b50: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
8b60: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
8b70: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
8b80: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
8b90: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
8ba0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
8bb0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
8bc0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
8bd0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
8be0: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
8bf0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
8c00: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
8c10: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
8c20: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
8c30: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
8c40: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
8c50: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
8c60: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
8c70: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
8c80: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
8c90: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
8ca0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
8cb0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
8cc0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
8cd0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
8ce0: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
8cf0: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
8d00: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
8d10: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
8d20: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
8d30: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
8d40: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
8d50: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
8d60: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
8d70: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
8d80: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
8d90: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
8da0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
8db0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
8dc0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
8dd0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
8de0: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
8df0: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
8e00: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
8e10: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
8e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
8e30: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8e40: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
8e50: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
8e60: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
8e70: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
8e80: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
8e90: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
8ea0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
8eb0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
8ec0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
8ed0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
8ee0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
8ef0: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
8f00: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8f10: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
8f20: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
8f30: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
8f40: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
8f50: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
8f60: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
8f70: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
8f80: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
8f90: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
8fa0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
8fb0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
8fc0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
8fd0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8fe0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
8ff0: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
9000: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
9010: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
9020: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
9030: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
9040: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
9050: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
9060: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
9070: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
9080: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
9090: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
90a0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
90b0: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
90c0: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
90d0: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
90e0: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
90f0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
9100: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
9110: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
9120: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
9130: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
9140: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
9150: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
9160: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
9170: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
9180: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
9190: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
91a0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
91b0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
91c0: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
91d0: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
91e0: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
91f0: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
9200: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
9210: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
9220: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
9230: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
9240: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
9250: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
9260: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
9270: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
9280: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
9290: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
92a0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
92b0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
92c0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
92d0: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
92e0: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
92f0: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
9300: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
9310: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
9320: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
9330: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
9340: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
9350: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
9360: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
9370: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
9380: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
9390: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
93a0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
93b0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
93c0: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
93d0: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
93e0: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
93f0: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
9400: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
9410: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
9420: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
9430: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
9440: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
9450: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
9460: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
9470: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
9480: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
9490: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
94a0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
94b0: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
94c0: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
94d0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
94e0: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
94f0: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
9500: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
9510: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
9520: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
9530: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
9540: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
9550: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
9560: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
9570: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
9580: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
9590: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
95a0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
95b0: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
95c0: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
95d0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
95e0: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
95f0: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
9600: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f  ks. */.#else.  /
9610: 2a 20 57 65 20 61 72 65 20 74 6f 6c 64 20 74 68  * We are told th
9620: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
9630: 20 6f 66 20 41 6e 64 72 6f 69 64 20 63 6f 6e 74   of Android cont
9640: 61 69 6e 20 61 20 62 75 67 20 74 68 61 74 0a 20  ain a bug that. 
9650: 20 2a 2a 20 73 69 7a 65 73 20 69 6e 6f 5f 74 20   ** sizes ino_t 
9660: 61 74 20 6f 6e 6c 79 20 33 32 2d 62 69 74 73 20  at only 32-bits 
9670: 69 6e 73 74 65 61 64 20 6f 66 20 36 34 2d 62 69  instead of 64-bi
9680: 74 73 2e 20 28 53 65 65 0a 20 20 2a 2a 20 68 74  ts. (See.  ** ht
9690: 74 70 73 3a 2f 2f 61 6e 64 72 6f 69 64 2d 72 65  tps://android-re
96a0: 76 69 65 77 2e 67 6f 6f 67 6c 65 73 6f 75 72 63  view.googlesourc
96b0: 65 2e 63 6f 6d 2f 23 2f 63 2f 31 31 35 33 35 31  e.com/#/c/115351
96c0: 2f 33 2f 64 69 73 74 2f 73 71 6c 69 74 65 33 2e  /3/dist/sqlite3.
96d0: 63 29 0a 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20  c).  ** To work 
96e0: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 61 6c 77  around this, alw
96f0: 61 79 73 20 61 6c 6c 6f 63 61 74 65 20 36 34 2d  ays allocate 64-
9700: 62 69 74 73 20 66 6f 72 20 74 68 65 20 69 6e 6f  bits for the ino
9710: 64 65 20 6e 75 6d 62 65 72 2e 20 20 0a 20 20 2a  de number.  .  *
9720: 2a 20 4f 6e 20 73 6d 61 6c 6c 20 6d 61 63 68 69  * On small machi
9730: 6e 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 68 61  nes that only ha
9740: 76 65 20 33 32 2d 62 69 74 20 69 6e 6f 64 65 73  ve 32-bit inodes
9750: 2c 20 74 68 69 73 20 77 61 73 74 65 73 20 34 20  , this wastes 4 
9760: 62 79 74 65 73 2c 0a 20 20 2a 2a 20 62 75 74 20  bytes,.  ** but 
9770: 74 68 61 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  that should not 
9780: 62 65 20 61 20 62 69 67 20 64 65 61 6c 2e 20 2a  be a big deal. *
9790: 2f 0a 20 20 2f 2a 20 57 41 53 3a 20 20 69 6e 6f  /.  /* WAS:  ino
97a0: 5f 74 20 69 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75  _t ino;   */.  u
97b0: 36 34 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  64 ino;         
97c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
97d0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
97e0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
97f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
9800: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
9810: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
9820: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
9830: 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ** inode..**.** 
9840: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
9850: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
9860: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9870: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
9880: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
9890: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
98a0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
98b0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
98c0: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
98d0: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
98e0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
98f0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
9900: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2a 0a  nting to it..**.
9910: 2a 2a 20 4d 75 74 65 78 20 72 75 6c 65 73 3a 0a  ** Mutex rules:.
9920: 2a 2a 0a 2a 2a 20 20 28 31 29 20 4f 6e 6c 79 20  **.**  (1) Only 
9930: 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d  the pLockMutex m
9940: 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
9950: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  d in order to re
9960: 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 20  ad or write.**  
9970: 20 20 20 20 61 6e 79 20 6f 66 20 74 68 65 20 6c      any of the l
9980: 6f 63 6b 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  ocking fields:.*
9990: 2a 20 20 20 20 20 20 20 20 20 20 6e 53 68 61 72  *          nShar
99a0: 65 64 2c 20 6e 4c 6f 63 6b 2c 20 65 46 69 6c 65  ed, nLock, eFile
99b0: 4c 6f 63 6b 2c 20 62 50 72 6f 63 65 73 73 4c 6f  Lock, bProcessLo
99c0: 63 6b 2c 20 70 55 6e 75 73 65 64 0a 2a 2a 0a 2a  ck, pUnused.**.*
99d0: 2a 20 20 28 32 29 20 57 68 65 6e 20 6e 52 65 66  *  (2) When nRef
99e0: 3e 30 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  >0, then the fol
99f0: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
9a00: 65 20 75 6e 63 68 61 6e 67 69 6e 67 20 61 6e 64  e unchanging and
9a10: 20 63 61 6e 0a 2a 2a 20 20 20 20 20 20 62 65 20   can.**      be 
9a20: 72 65 61 64 20 28 62 75 74 20 6e 6f 74 20 77 72  read (but not wr
9a30: 69 74 74 65 6e 29 20 77 69 74 68 6f 75 74 20 68  itten) without h
9a40: 6f 6c 64 69 6e 67 20 61 6e 79 20 6d 75 74 65 78  olding any mutex
9a50: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69  :.**          fi
9a60: 6c 65 49 64 2c 20 70 4c 6f 63 6b 4d 75 74 65 78  leId, pLockMutex
9a70: 0a 2a 2a 0a 2a 2a 20 20 28 33 29 20 57 69 74 68  .**.**  (3) With
9a80: 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20   the exceptions 
9a90: 61 62 6f 76 65 2c 20 61 6c 6c 20 74 68 65 20 66  above, all the f
9aa0: 69 65 6c 64 73 20 6d 61 79 20 6f 6e 6c 79 20 62  ields may only b
9ab0: 65 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 6f  e read.**      o
9ac0: 72 20 77 72 69 74 74 65 6e 20 77 68 69 6c 65 20  r written while 
9ad0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 67 6c 6f 62  holding the glob
9ae0: 61 6c 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d  al unixBigLock m
9af0: 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 44 65 61 64  utex..**.** Dead
9b00: 6c 6f 63 6b 20 70 72 65 76 65 6e 74 69 6f 6e 3a  lock prevention:
9b10: 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69    The global uni
9b20: 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 20 6d  xBigLock mutex m
9b30: 61 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 63 71  ay not.** be acq
9b40: 75 69 72 65 64 20 77 68 69 6c 65 20 68 6f 6c 64  uired while hold
9b50: 69 6e 67 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74  ing the pLockMut
9b60: 65 78 20 6d 75 74 65 78 2e 20 20 49 66 20 62 6f  ex mutex.  If bo
9b70: 74 68 20 75 6e 69 78 42 69 67 4c 6f 63 6b 0a 2a  th unixBigLock.*
9b80: 2a 20 61 6e 64 20 70 4c 6f 63 6b 4d 75 74 65 78  * and pLockMutex
9b90: 20 61 72 65 20 6e 65 65 64 65 64 2c 20 74 68 65   are needed, the
9ba0: 6e 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75  n unixBigLock mu
9bb0: 73 74 20 62 65 20 61 63 71 75 69 72 65 64 20 66  st be acquired f
9bc0: 69 72 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  irst..*/.struct 
9bd0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a  unixInodeInfo {.
9be0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
9bf0: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
9c00: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
9c10: 6b 65 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  key */.  sqlite3
9c20: 5f 6d 75 74 65 78 20 2a 70 4c 6f 63 6b 4d 75 74  _mutex *pLockMut
9c30: 65 78 3b 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64  ex;      /* Hold
9c40: 20 74 68 69 73 20 6d 75 74 65 78 20 66 6f 72 2e   this mutex for.
9c50: 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  .. */.  int nSha
9c60: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
9c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9c80: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
9c90: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
9ca0: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
9cd0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
9ce0: 63 6b 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  cks */.  unsigne
9cf0: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
9d00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
9d10: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
9d20: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
9d30: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
9d40: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9d50: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41  Lock;       /* A
9d60: 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63  n exclusive proc
9d70: 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ess lock is held
9d80: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
9d90: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
9da0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
9db0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
9dc0: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
9dd0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
9e00: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
9e10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
9e20: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
9e30: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
9e40: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
9e50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9e60: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 75  his inode */.  u
9e70: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
9e80: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
9e90: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
9ea0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9eb0: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
9ec0: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
9ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
9ee0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
9ef0: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
9f00: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
9f10: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
9f20: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
9f30: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
9f40: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
9f50: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
9f60: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
9f70: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
9fa0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
9fb0: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
9fc0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
9fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
9fe0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
9ff0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
a000: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
a010: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
a020: 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 75 73 74 20  cts..**.** Must 
a030: 68 6f 6c 64 20 75 6e 69 78 42 69 67 4c 6f 63 6b  hold unixBigLock
a040: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 61   in order to rea
a050: 64 20 6f 72 20 77 72 69 74 65 20 74 68 69 73 20  d or write this 
a060: 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
a070: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
a080: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
a090: 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e  ;  /* All unixIn
a0a0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
a0b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a0c0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 72  E_DEBUG./*.** Tr
a0d0: 75 65 20 69 66 20 74 68 65 20 69 6e 6f 64 65 20  ue if the inode 
a0e0: 6d 75 74 65 78 20 28 6f 6e 20 74 68 65 20 75 6e  mutex (on the un
a0f0: 69 78 46 69 6c 65 2e 70 46 69 6c 65 4d 75 74 65  ixFile.pFileMute
a100: 78 20 66 69 65 6c 64 29 20 69 73 20 68 65 6c 64  x field) is held
a110: 2c 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 54 68 69  , or not..** Thi
a120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a130: 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
a140: 73 65 72 74 28 29 20 74 6f 20 68 65 6c 70 20 76  sert() to help v
a150: 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 6d 75  erify correct mu
a160: 74 65 78 0a 2a 2a 20 75 73 61 67 65 2e 0a 2a 2f  tex.** usage..*/
a170: 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74  .int unixFileMut
a180: 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c 65 20  exHeld(unixFile 
a190: 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
a1a0: 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
a1b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
a1c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a1d0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
a1e0: 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 69 6e  LockMutex);.}.in
a1f0: 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  t unixFileMutexN
a200: 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c 65 20  otheld(unixFile 
a210: 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
a220: 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
a230: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
a240: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
a250: 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ld(pFile->pInode
a260: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d  ->pLockMutex);.}
a270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 0a 2a  .#endif../*.**.*
a280: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a290: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  - unixLogErrorAt
a2a0: 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20  Line(), is only 
a2b0: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
a2c0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
a2d0: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
a2e0: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
a2f0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
a300: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
a310: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
a320: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
a330: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
a340: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
a350: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
a360: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
a370: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
a380: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
a390: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
a3a0: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
a3b0: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
a3c0: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
a3d0: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
a3e0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
a3f0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
a400: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
a410: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
a420: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
a430: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
a440: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
a450: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
a460: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
a470: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
a480: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
a490: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
a4a0: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
a4b0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
a4c0: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
a4d0: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
a4e0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
a4f0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
a500: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
a510: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
a520: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
a530: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a540: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
a550: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
a560: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
a570: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
a5a0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
a5b0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a5d0: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
a5e0: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
a5f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a600: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
a610: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
a620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a630: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
a640: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
a650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a660: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
a670: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
a680: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
a690: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6b0: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
a6c0: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
a6d0: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
a6e0: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a700: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
a710: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
a720: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
a730: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
a740: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
a750: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
a760: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
a770: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
a780: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
a790: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
a7a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
a7b0: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
a7c0: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
a7d0: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
a7e0: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
a7f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a800: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
a810: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
a820: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
a830: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
a840: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
a850: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
a860: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
a870: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
a880: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
a890: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
a8a0: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
a8b0: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
a8c0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
a8d0: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
a8e0: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
a8f0: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
a900: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
a910: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
a920: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
a930: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
a940: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
a950: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
a960: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
a970: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
a980: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
a990: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
a9a0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
a9b0: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
a9c0: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
a9d0: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
a9e0: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
a9f0: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
aa00: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
aa10: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
aa20: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
aa30: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
aa40: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
aa50: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
aa60: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
aa70: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
aa80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
aa90: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
aaa0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
aab0: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
aac0: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
aad0: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
aae0: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
aaf0: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
ab00: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
ab10: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
ab20: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
ab30: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
ab40: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
ab50: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
ab60: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
ab70: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
ab80: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
ab90: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
aba0: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
abb0: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
abc0: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
abd0: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
abe0: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
abf0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
ac00: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
ac10: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
ac20: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
ac30: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
ac40: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
ac50: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
ac60: 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  f..  if( zPath==
ac70: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
ac80: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
ac90: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
aca0: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
acb0: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
acc0: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
acd0: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
ace0: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
acf0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
ad00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
ad10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
ad20: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
ad30: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
ad40: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
ad50: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
ad60: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
ad70: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
ad80: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
ad90: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
ada0: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
adb0: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
adc0: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
add0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ade0: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
adf0: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
ae00: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
ae10: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
ae20: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
ae30: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
ae40: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
ae50: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
ae60: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
ae70: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
ae80: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
ae90: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
aea0: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
aeb0: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
aec0: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
aed0: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
aee0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
aef0: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
af00: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
af10: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
af20: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
af30: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
af40: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
af50: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
af60: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
af90: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
afa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
afb0: 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c  Set the pFile->l
afc0: 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68  astErrno.  Do th
afd0: 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69  is in a subrouti
afe0: 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f 76 69  ne as that provi
aff0: 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69  des.** a conveni
b000: 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
b010: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a   a breakpoint..*
b020: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
b030: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69  oreLastErrno(uni
b040: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
b050: 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c  t error){.  pFil
b060: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
b070: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rror;.}../*.** C
b080: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
b090: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
b0a0: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
b0b0: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
b0c0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
b0d0: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
b0e0: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
b0f0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
b100: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
b110: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
b120: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
b130: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
b140: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
b150: 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65  assert( unixFile
b160: 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29  MutexHeld(pFile)
b170: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f   );.  for(p=pIno
b180: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
b190: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
b1a0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
b1b0: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
b1c0: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
b1d0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
b1e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
b1f0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
b200: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
b210: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
b220: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
b230: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
b240: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
b250: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
b260: 0a 2a 2a 20 54 68 65 20 67 6c 6f 62 61 6c 20 6d  .** The global m
b270: 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
b280: 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  d when this rout
b290: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 62  ine is called, b
b2a0: 75 74 20 74 68 65 20 6d 75 74 65 78 0a 2a 2a 20  ut the mutex.** 
b2b0: 6f 6e 20 74 68 65 20 69 6e 6f 64 65 20 62 65 69  on the inode bei
b2c0: 6e 67 20 64 65 6c 65 74 65 64 20 6d 75 73 74 20  ng deleted must 
b2d0: 4e 4f 54 20 62 65 20 68 65 6c 64 2e 0a 2a 2f 0a  NOT be held..*/.
b2e0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b2f0: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
b300: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
b310: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b320: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
b330: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
b340: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
b350: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ) );.  assert( u
b360: 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68  nixFileMutexNoth
b370: 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  eld(pFile) );.  
b380: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
b390: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
b3a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
b3b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
b3c0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
b3d0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
b3e0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
b3f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
b400: 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
b410: 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 63  kMutex);.      c
b420: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
b430: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
b440: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
b450: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b460: 74 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tex);.      if( 
b470: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
b480: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b490: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
b4a0: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
b4b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b4c0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b4d0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b4e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b4f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
b500: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
b510: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
b520: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
b530: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b540: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
b550: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
b560: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
b570: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
b580: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
b590: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
b5a0: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
b5b0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
b5c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
b5d0: 5f 66 72 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  _free(pInode->pL
b5e0: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ockMutex);.     
b5f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
b600: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
b610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b620: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
b630: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
b640: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
b650: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
b660: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
b670: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
b680: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
b690: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
b6a0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
b6b0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
b6c0: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
b6d0: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
b6e0: 20 54 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   The global mute
b6f0: 78 20 6d 75 73 74 20 68 65 6c 64 20 77 68 65 6e  x must held when
b700: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
b710: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  utine..**.** Ret
b720: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
b730: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
b740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
b750: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
b760: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b780: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
b790: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
b7a0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
b7b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
b7c0: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
b7d0: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
b7e0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b7f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
b800: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
b810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b820: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
b830: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
b840: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
b850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b860: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b870: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
b880: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
b890: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
b8a0: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
b8b0: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
b8c0: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
b8d0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
b8f0: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
b900: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
b910: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
b920: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
b930: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
b940: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
b950: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
b960: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
b970: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
b980: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
b990: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
b9a0: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
b9b0: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
b9c0: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
b9d0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
b9e0: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
b9f0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
ba00: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
ba10: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
ba20: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ba30: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
ba40: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
ba50: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
ba60: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
ba70: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
ba80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
ba90: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
baa0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
bab0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
bac0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
bad0: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
bae0: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
baf0: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
bb00: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
bb10: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
bb20: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
bb30: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
bb40: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
bb50: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
bb60: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
bb70: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
bb80: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
bb90: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
bba0: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
bbb0: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
bbc0: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
bbd0: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
bbe0: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
bbf0: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
bc00: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
bc10: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
bc20: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
bc30: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
bc40: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
bc50: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
bc60: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
bc70: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
bc80: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
bc90: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
bca0: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
bcb0: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
bcc0: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
bcd0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
bce0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
bcf0: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
bd00: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
bd10: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
bd20: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
bd30: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
bd40: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
bd50: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
bd60: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
bd70: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
bd80: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
bd90: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
bda0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
bdb0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
bdc0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
bdd0: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
bde0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
bdf0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
be00: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
be10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
be20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
be30: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
be40: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
be50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
be60: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
be70: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
be80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
be90: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
bea0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
beb0: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
bec0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
bed0: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
bee0: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
bef0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
bf00: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
bf10: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
bf20: 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29  leId.ino = (u64)
bf30: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
bf40: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
bf50: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
bf60: 20 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69   );.  pInode = i
bf70: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
bf80: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
bf90: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
bfa0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
bfb0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
bfc0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
bfd0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
bfe0: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
bff0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
c000: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c010: 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  4( sizeof(*pInod
c020: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
c030: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
c040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c050: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
c060: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
c070: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
c080: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
c090: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
c0a0: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
c0b0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
c0c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
c0d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
c0e0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Mutex ){.      p
c0f0: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
c100: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
c110: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
c120: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
c130: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c    if( pInode->pL
c140: 6f 63 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  ockMutex==0 ){. 
c150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
c160: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
c170: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c180: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
c190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c1a0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
c1b0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75  1;.    assert( u
c1c0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
c1d0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
c1e0: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
c1f0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
c200: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
c210: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
c220: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
c230: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
c240: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
c250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
c260: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
c270: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
c280: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
c290: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
c2b0: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
c2c0: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
c2d0: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
c2e0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
c2f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
c300: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
c310: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
c320: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
c330: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
c340: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
c350: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
c360: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
c370: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
c380: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
c390: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
c3a0: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
c3b0: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
c3c0: 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20   &buf)!=0 .     
c3d0: 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e      || (u64)buf.
c3e0: 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70  st_ino!=pFile->p
c3f0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
c400: 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  o);.#endif.}.../
c410: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69  *.** Check a uni
c420: 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20  xFile that is a 
c430: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
c440: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  y the following:
c450: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65  .**.** (1) There
c460: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
c470: 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65  hard link on the
c480: 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65   file.** (2) The
c490: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73   file is not a s
c4a0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20  ymbolic link.** 
c4b0: 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73  (3) The file has
c4c0: 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65   not been rename
c4d0: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a  d or unlinked.**
c4e0: 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65  .** Issue sqlite
c4f0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
c500: 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67  NING,...) messag
c510: 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  es if anything i
c520: 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a  s not right..*/.
c530: 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69  static void veri
c540: 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c  fyDbFile(unixFil
c550: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72  e *pFile){.  str
c560: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
c570: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
c580: 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ese verification
c590: 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65  s occurs for the
c5a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
c5b0: 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  nly */.  if( pFi
c5c0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
c5d0: 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
c5e0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20  ) return;..  rc 
c5f0: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
c600: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
c610: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
c620: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c630: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
c640: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
c650: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
c660: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
c670: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
c680: 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  _nlink==0 ){.   
c690: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c6a0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c6b0: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
c6c0: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c6d0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c6e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
c6f0: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
c700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c710: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
c720: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
c730: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
c740: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
c750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c760: 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f  .  if( fileHasMo
c770: 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ved(pFile) ){.  
c780: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c790: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
c7a0: 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c  ile renamed whil
c7b0: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c7c0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c7d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a  return;.  }.}...
c7e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c7f0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c800: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c810: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c820: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c830: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c840: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c850: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c860: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c870: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c880: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c890: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c8a0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c8b0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c8c0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c8d0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c8e0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c8f0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c900: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
c910: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
c920: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
c930: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c940: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
c950: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c960: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
c970: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
c980: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c990: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
c9a0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c9b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
c9c0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
c9d0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
c9e0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
c9f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ca00: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
ca10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  D_LOCK );.  sqli
ca20: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ca30: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
ca40: 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  LockMutex);..  /
ca50: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
ca60: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
ca70: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
ca80: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
ca90: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
caa0: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
cab0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
cac0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
cad0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
cae0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
caf0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
cb00: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
cb10: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
cb20: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
cb30: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
cb40: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
cb50: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
cb60: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
cb70: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
cb80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
cb90: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
cba0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
cbb0: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
cbc0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
cbd0: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
cbe0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
cbf0: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
cc00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cc10: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
cc20: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
cc30: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
cc40: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
cc50: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
cc60: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
cc70: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
cc80: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
cc90: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71  }.#endif.  .  sq
cca0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ccb0: 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  e(pFile->pInode-
ccc0: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
ccd0: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
cce0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
ccf0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
cd00: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
cd10: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
cd20: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
cd30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cd40: 2a 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61  ** Set a posix-a
cd50: 64 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a  dvisory-lock..**
cd60: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
cd70: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
cd80: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20  is routine.  If 
cd90: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a  compiled with.**
cda0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cdb0: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65  ETLK_TIMEOUT the
cdc0: 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61  n the routine ha
cdd0: 73 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d  s an extra param
cde0: 65 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73  eter.** which is
cdf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
ce00: 75 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68  unixFile.  If th
ce10: 65 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73  e unixFile->iBus
ce20: 79 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75  yTimeout.** valu
ce30: 65 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  e is set, then i
ce40: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
ce50: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
ce60: 74 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a  to wait before.*
ce70: 2a 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f  * failing the lo
ce80: 63 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69  ck.  The iBusyTi
ce90: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61  meout value is a
cea0: 6c 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b  lways reset back
ceb0: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65   to.** zero on e
cec0: 61 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ach call..**.** 
ced0: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
cee0: 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69  _SETLK_TIMEOUT i
cef0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74  s not defined, t
cf00: 68 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f  hen do a non-blo
cf10: 63 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74  cking.** attempt
cf20: 20 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b   to set the lock
cf30: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
cf40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
cf50: 5f 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e  _TIMEOUT.# defin
cf60: 65 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  e osSetPosixAdvi
cf70: 73 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20  soryLock(h,x,t) 
cf80: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
cf90: 4b 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69  K,x).#else.stati
cfa0: 63 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78  c int osSetPosix
cfb0: 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20  AdvisoryLock(.  
cfc0: 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
cfd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
cfe0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
cff0: 77 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68  which to take th
d000: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75  e lock */.  stru
d010: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c  ct flock *pLock,
d020: 20 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70    /* The descrip
d030: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tion of the lock
d040: 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
d050: 70 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53  pFile       /* S
d060: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67  tructure holding
d070: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a   timeout value *
d080: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d090: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
d0a0: 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c  K,pLock);.  whil
d0b0: 65 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65  e( rc<0 && pFile
d0c0: 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30  ->iBusyTimeout>0
d0d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79   ){.    /* On sy
d0e0: 73 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f  stems that suppo
d0f0: 72 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20  rt some kind of 
d100: 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f  blocking file lo
d110: 63 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75  ck with a timeou
d120: 74 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61  t,.    ** make a
d130: 70 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67  ppropriate chang
d140: 65 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b  es here to invok
d150: 65 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20  e that blocking 
d160: 66 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20  file lock.  On. 
d170: 20 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f     ** generic po
d180: 73 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68  six, however, th
d190: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41  ere is no such A
d1a0: 50 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c  PI.  So we simpl
d1b0: 79 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a  y try the.    **
d1c0: 20 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79   lock once every
d1d0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74   millisecond unt
d1e0: 69 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69  il either the ti
d1f0: 6d 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f  meout expires, o
d200: 72 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74  r until.    ** t
d210: 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
d220: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65  ned. */.    usle
d230: 65 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63  ep(1000);.    rc
d240: 20 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53   = osFcntl(h,F_S
d250: 45 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20  ETLK,pLock);.   
d260: 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d   pFile->iBusyTim
d270: 65 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  eout--;.  }.  re
d280: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
d290: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
d2a0: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
d2b0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   */.../*.** Atte
d2c0: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
d2d0: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
d2e0: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
d2f0: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
d300: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
d310: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
d320: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
d330: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
d340: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
d350: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
d360: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
d370: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
d380: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
d390: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
d3a0: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
d3b0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
d3c0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
d3d0: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
d3e0: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
d3f0: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
d400: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
d410: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
d420: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
d430: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
d440: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
d450: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
d460: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
d470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
d480: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
d490: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
d4a0: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
d4b0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
d4c0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
d4d0: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
d4e0: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
d4f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d500: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
d510: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
d520: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
d530: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
d540: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
d550: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
d560: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
d570: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
d580: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
d590: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
d5a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d5b0: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
d5c0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
d5d0: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
d5e0: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
d5f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
d600: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
d610: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
d620: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
d630: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
d640: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
d650: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
d660: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
d670: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
d680: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
d690: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d6a0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
d6b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d6c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d6d0: 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  d(pInode->pLockM
d6e0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28  utex) );.  if( (
d6f0: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
d700: 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43   & (UNIXFILE_EXC
d710: 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  L|UNIXFILE_RDONL
d720: 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58  Y))==UNIXFILE_EX
d730: 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  CL ){.    if( pI
d740: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
d750: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
d760: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
d770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d780: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
d790: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
d7a0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d7b0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
d7c0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
d7d0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
d7e0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d7f0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
d800: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
d810: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
d820: 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72  sSetPosixAdvisor
d830: 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  yLock(pFile->h, 
d840: 26 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20  &lock, pFile);. 
d850: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
d860: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
d870: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
d880: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
d890: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
d8a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d8b0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
d8c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d8d0: 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76   = osSetPosixAdv
d8e0: 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d  isoryLock(pFile-
d8f0: 3e 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65  >h, pLock, pFile
d900: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d910: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
d920: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
d930: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
d940: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
d950: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
d960: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
d970: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
d980: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
d990: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
d9a0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
d9b0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
d9c0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
d9d0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
d9e0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
d9f0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
da00: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
da10: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
da20: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
da30: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
da40: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
da50: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
da60: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
da70: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
da80: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
da90: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
daa0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
dab0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
dac0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
dad0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
dae0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
daf0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
db00: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
db10: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
db20: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
db30: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
db40: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
db50: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
db60: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
db70: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
db80: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
db90: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
dba0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
dbb0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
dbc0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
dbd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
dbe0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
dbf0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
dc00: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
dc10: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
dc20: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
dc30: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
dc40: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
dc50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
dc60: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
dc70: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
dc80: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
dc90: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
dca0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
dcb0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
dcc0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
dcd0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
dce0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
dcf0: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
dd00: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
dd10: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
dd20: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
dd30: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
dd40: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
dd50: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
dd60: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
dd70: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
dd80: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
dd90: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
dda0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
ddb0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
ddc0: 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d  Windows95 system
ddd0: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
dde0: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
ddf0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
de00: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
de10: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
de20: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
de30: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
de40: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
de50: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
de60: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
de70: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
de80: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
de90: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
dea0: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
deb0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
dec0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
ded0: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
dee0: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
def0: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
df00: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
df10: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
df20: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
df30: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
df40: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
df50: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
df60: 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72  uccessful, 'shar
df70: 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69  ed byte range' i
df80: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20  s read-locked.  
df90: 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ** and the lock 
dfa0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
dfb0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20  byte' released. 
dfc0: 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20   (Legacy note:  
dfd0: 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65  When.  ** SQLite
dfe0: 20 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c   was first devel
dff0: 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20  oped, Windows95 
e000: 73 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69  systems were sti
e010: 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a  ll very common,.
e020: 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73    ** and Widnows
e030: 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65  95 lacks a share
e040: 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74  d-lock capabilit
e050: 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77  y.  So on Window
e060: 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67  s95, a.  ** sing
e070: 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65  le randomly sele
e080: 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65  cted by from the
e090: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
e0a0: 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  nge' is locked..
e0b0: 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69    ** Windows95 i
e0c0: 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63  s now pretty muc
e0d0: 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74  h extinct, but t
e0e0: 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
e0f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63  for the.  ** lac
e100: 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b  k of shared-lock
e110: 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c  s on Windows95 l
e120: 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63  ives on, for bac
e130: 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70  kwards.  ** comp
e140: 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a  atibility.).  **
e150: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
e160: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
e170: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
e180: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
e190: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
e1a0: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
e1b0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
e1c0: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
e1d0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
e1e0: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
e1f0: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
e200: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
e210: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
e220: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
e230: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
e240: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
e250: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
e260: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
e270: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
e280: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
e290: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
e2a0: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
e2b0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
e2c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
e2d0: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
e2e0: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
e2f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
e300: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
e310: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
e320: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
e330: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
e340: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
e350: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
e360: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
e370: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
e380: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
e390: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
e3a0: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
e3b0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
e3c0: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
e3d0: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
e3e0: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
e3f0: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
e400: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
e410: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
e420: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
e430: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
e440: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
e450: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
e460: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
e470: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
e480: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
e490: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
e4a0: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
e4b0: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
e4c0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
e4d0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
e4e0: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
e4f0: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f   database. .  */
e500: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e510: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
e520: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e530: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
e540: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e550: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
e560: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
e570: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
e580: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
e590: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e5a0: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
e5b0: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
e5c0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
e5d0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
e5e0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
e5f0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
e600: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
e610: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
e620: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
e630: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
e640: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e650: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e660: 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
e670: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
e680: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
e690: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
e6a0: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
e6b0: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
e6c0: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
e6d0: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
e6e0: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
e6f0: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
e700: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
e710: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
e720: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e730: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
e740: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
e750: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e760: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
e770: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
e780: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e790: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
e7a0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
e7b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e7c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
e7d0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
e7e0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
e7f0: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
e800: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
e810: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
e820: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
e830: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
e840: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
e850: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
e860: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
e870: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
e880: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
e890: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
e8a0: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
e8b0: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
e8c0: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
e8d0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
e8e0: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
e8f0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
e900: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e910: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
e920: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
e930: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
e940: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
e950: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
e960: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
e970: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
e980: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
e990: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
e9a0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
e9b0: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
e9c0: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f  eads.  */.  pIno
e9d0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
e9e0: 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
e9f0: 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65  tex_enter(pInode
ea00: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a  ->pLockMutex);..
ea10: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
ea20: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
ea30: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
ea40: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
ea50: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
ea60: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
ea70: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
ea80: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
ea90: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
eaa0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
eab0: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
eac0: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
ead0: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
eae0: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
eaf0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
eb00: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
eb10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
eb20: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
eb30: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
eb40: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
eb50: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
eb60: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
eb70: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
eb80: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
eb90: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
eba0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
ebb0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
ebc0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
ebd0: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
ebe0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
ebf0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
ec00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ec10: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
ec20: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ec30: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
ec40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
ec50: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
ec60: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
ec70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ec80: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
ec90: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
eca0: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
ecb0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
ecc0: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
ecd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ece0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
ecf0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ed00: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
ed10: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
ed20: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
ed30: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
ed40: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
ed50: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
ed60: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
ed70: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
ed80: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
ed90: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
eda0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
edb0: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
edc0: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
edd0: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
ede0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
edf0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ee00: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
ee10: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
ee20: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
ee30: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
ee40: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
ee50: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
ee60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
ee70: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
ee80: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
ee90: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
eea0: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
eeb0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
eec0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
eed0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
eee0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
eef0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
ef00: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ef10: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ef20: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ef30: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ef40: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
ef50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ef60: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
ef70: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
ef80: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
ef90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
efa0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
efb0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
efc0: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
efd0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
efe0: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
eff0: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
f000: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f010: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
f020: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
f030: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
f040: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f050: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
f060: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f070: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
f080: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
f090: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
f0a0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
f0b0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
f0c0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
f0d0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
f0e0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f0f0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
f100: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
f110: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
f120: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f130: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
f140: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f150: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
f160: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f170: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f180: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
f190: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
f1a0: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
f1b0: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
f1c0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
f1d0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
f1e0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
f1f0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
f200: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f210: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
f220: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f230: 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63  le, &lock) && rc
f240: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f250: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
f260: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
f270: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
f280: 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  /.      tErrno =
f290: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
f2a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f2b0: 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a  UNLOCK; .    }..
f2c0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f2d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f2e0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
f2f0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f300: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f320: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
f330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f340: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f350: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f360: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
f370: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
f380: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
f390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
f3a0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
f3b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
f3c0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f3d0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
f3e0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
f3f0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f400: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
f410: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
f420: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
f430: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
f440: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
f450: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
f460: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
f470: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
f480: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
f490: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
f4a0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
f4b0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
f4c0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
f4d0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
f4e0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
f4f0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
f500: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
f510: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
f520: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
f530: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f540: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
f550: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
f560: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
f570: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
f580: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
f590: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
f5a0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
f5b0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
f5c0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
f5d0: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
f5e0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
f5f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
f600: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f610: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f620: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f630: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f640: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
f650: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f660: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
f670: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f680: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f690: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f6a0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f6b0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
f6c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f6d0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
f6e0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f6f0: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f700: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
f710: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
f720: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f730: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
f740: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
f750: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
f760: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
f770: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
f780: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
f790: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
f7a0: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
f7b0: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
f7c0: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
f7d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f7e0: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
f7f0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
f800: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
f810: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
f820: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
f830: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
f840: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
f850: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
f860: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f870: 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
f880: 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
f890: 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
f8a0: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
f8b0: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
f8c0: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
f8d0: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
f8e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f8f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
f900: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
f910: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
f920: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f930: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
f940: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
f950: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
f960: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
f970: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
f980: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
f990: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f9a0: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
f9b0: 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
f9c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f9d0: 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
f9e0: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54  ockMutex);.  OST
f9f0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
fa00: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
fa10: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
fa20: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
fa30: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
fa40: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
fa50: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
fa60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fa70: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
fa80: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
fa90: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
faa0: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
fab0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
fac0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
fad0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
fae0: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
faf0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
fb00: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fb10: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
fb20: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
fb30: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50  d *p = pFile->pP
fb40: 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
fb50: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  d;.  assert( uni
fb60: 78 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70  xFileMutexHeld(p
fb70: 46 69 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e  File) );.  p->pN
fb80: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
fb90: 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
fba0: 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
fbb0: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
fbc0: 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
fbd0: 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b  catedUnused = 0;
fbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
fbf0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fc00: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
fc10: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
fc20: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
fc30: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
fc40: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
fc50: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
fc60: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
fc70: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
fc80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fc90: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
fca0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
fcb0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
fcc0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
fcd0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
fce0: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
fcf0: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
fd00: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
fd10: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
fd20: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
fd30: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
fd40: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
fd50: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
fd60: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
fd70: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
fd80: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
fd90: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
fda0: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
fdb0: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
fdc0: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
fdd0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
fde0: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
fdf0: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
fe00: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
fe10: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
fe20: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
fe30: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
fe40: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
fe50: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
fe60: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
fe70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fe80: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
fe90: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
fea0: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
feb0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fec0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
fed0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
fee0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
fef0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
ff00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
ff10: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ff20: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
ff30: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
ff40: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
ff50: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
ff60: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
ff70: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
ff80: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
ff90: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
ffa0: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
ffb0: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
ffc0: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
ffd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
ffe0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
fff0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
10000 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
10010 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
10020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10030 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20  .  }.  pInode = 
10040 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
10050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10060 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
10070 63 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ckMutex);.  asse
10080 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
10090 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
100a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
100b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
100c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
100d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
100e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
100f0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
10100 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
10110 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
10120 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
10130 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
10140 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
10150 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
10160 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
10170 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
10180 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10190 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
101a0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
101b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
101c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
101d0 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
101e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
101f0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
10200 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
10210 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
10220 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
10230 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
10240 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
10250 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
10260 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
10270 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
10280 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
10290 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
102a0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
102b0 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
102c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
102d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
102e0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
102f0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
10300 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
10310 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
10320 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
10330 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
10340 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
10350 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
10360 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
10370 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
10380 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
10390 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
103a0 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
103b0 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
103c0 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
103d0 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
103e0 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
103f0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
10400 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
10410 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
10420 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
10430 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
10440 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
10450 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
10460 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
10470 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
10480 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
10490 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
104a0 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  K ){.#if !define
104b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
104c0 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  !SQLITE_ENABLE_L
104d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
104e0 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e     (void)handleN
104f0 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  FSUnlock;.      
10500 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46  assert( handleNF
10510 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65  SUnlock==0 );.#e
10520 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
10530 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
10540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
10550 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
10560 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e   if( handleNFSUn
10570 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
10580 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20  int tErrno;     
10590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
105a0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73  or code from sys
105b0 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20  tem call errors 
105c0 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
105d0 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
105e0 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
105f0 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
10600 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
10610 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
10620 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10630 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
10640 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10650 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
10660 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10670 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
10680 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10690 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
106a0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
106b0 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
106c0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
106d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
106e0 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
106f0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10700 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10710 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
10720 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
10730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
10740 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
10750 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
10760 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10770 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
10780 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10790 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
107a0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
107b0 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
107c0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
107d0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
107e0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
107f0 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
10800 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
10810 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10820 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10830 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10840 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
10850 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10860 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10870 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
10880 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
10890 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
108a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
108b0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
108c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
108d0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
108e0 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
108f0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10900 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10910 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10920 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
10930 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
10940 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10950 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
10960 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10970 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10980 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
10990 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
109a0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
109b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
109c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
109d0 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
109e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
109f0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
10a00 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10a10 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10a20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
10a30 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
10a40 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
10a50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10a60 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  TYLE */.      {.
10a70 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10a80 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
10a90 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
10aa0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10ab0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10ac0 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10ad0 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
10ae0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
10af0 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
10b00 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10b10 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
10b20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
10b30 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
10b40 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
10b50 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
10b60 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
10b70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
10b80 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
10b90 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
10ba0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
10bb0 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
10bc0 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
10bd0 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
10be0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
10bf0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
10c00 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
10c10 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
10c20 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
10c30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10c40 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
10c50 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
10c60 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
10c70 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
10c80 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
10c90 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
10ca0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
10cb0 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
10cc0 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
10cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10ce0 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
10cf0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10d00 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
10d10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10d20 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10d40 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
10d50 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10d60 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10d70 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10d80 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10d90 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
10da0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10db0 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
10dc0 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
10dd0 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
10de0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10df0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
10e10 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
10e20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
10e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
10e40 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10e50 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
10e60 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10e70 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
10e80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
10e90 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
10ea0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
10eb0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
10ec0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
10ed0 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
10ee0 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
10ef0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
10f00 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
10f10 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
10f20 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
10f30 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
10f40 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
10f50 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
10f60 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
10f70 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
10f80 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
10f90 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
10fa0 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
10fb0 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
10fc0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10fd0 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
10fe0 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
10ff0 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
11000 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
11010 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
11020 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
11030 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11040 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
11050 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
11060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11070 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74  LOCK;.        st
11080 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
11090 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
110a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
110b0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
110c0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
110d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
110e0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
110f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
11100 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
11110 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
11120 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
11130 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
11140 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
11150 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
11160 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
11170 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
11180 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
11190 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
111a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
111b0 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
111c0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
111d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
111e0 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
111f0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
11200 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65  nLock==0 ) close
11210 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
11220 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f  );.  }..end_unlo
11230 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ck:.  sqlite3_mu
11240 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
11250 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
11260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11270 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
11280 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11290 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
112a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
112b0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
112c0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
112d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
112e0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
112f0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
11300 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
11310 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
11320 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
11330 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
11340 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
11350 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
11360 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
11370 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
11380 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
11390 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
113a0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
113b0 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
113c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
113d0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
113e0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
113f0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11400 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
11410 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
11420 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
11430 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
11440 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
11450 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
11460 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
11470 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
11480 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
11490 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
114a0 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
114b0 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
114c0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
114d0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
114e0 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
114f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
11500 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
11510 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
11520 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
11530 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
11540 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
11550 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
11560 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
11570 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
11580 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
11590 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
115a0 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
115b0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
115c0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
115d0 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
115e0 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
115f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
11600 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
11610 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
11620 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
11630 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
11640 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
11650 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
11660 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
11670 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
11680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11690 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
116a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
116b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
116c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
116d0 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
116e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
116f0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
11700 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
11710 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
11720 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
11730 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
11740 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
11750 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
11760 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
11770 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
11780 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
11790 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
117a0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
117b0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
117c0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
117d0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
117e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
117f0 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
11800 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
11810 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
11820 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
11830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c  ifdef SQLITE_UNL
11840 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a  INK_AFTER_CLOSE.
11850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
11860 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
11870 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
11880 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
11890 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
118a0 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a  te3_free(*(char*
118b0 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  *)&pFile->zPath)
118c0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61  ;.    pFile->zPa
118d0 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  th = 0;.  }.#end
118e0 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
118f0 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
11900 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
11910 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
11920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
11930 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
11940 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  edUnused);.  mem
11950 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
11960 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
11970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11980 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
11990 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
119a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
119b0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
119c0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
119d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
119e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
119f0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
11a00 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
11a10 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
11a20 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73  ->pInode;..  ass
11a30 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
11a40 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65  ;.  verifyDbFile
11a50 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55  (pFile);.  unixU
11a60 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11a70 4b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  K);.  assert( un
11a80 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65  ixFileMutexNothe
11a90 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75  ld(pFile) );.  u
11aa0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11ab0 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
11ac0 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
11ad0 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
11ae0 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
11af0 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
11b00 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
11b10 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
11b20 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
11b30 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
11b40 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
11b50 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
11b60 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
11b70 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
11b80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11b90 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c  enter(pInode->pL
11ba0 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  ockMutex);.  if(
11bb0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29   pInode->nLock )
11bc0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
11bd0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
11be0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
11bf0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
11c00 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
11c10 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
11c20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
11c30 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
11c40 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
11c50 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
11c60 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
11c70 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
11c80 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
11c90 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
11ca0 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
11cb0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
11cc0 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
11cd0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
11ce0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  pFile);.  }.  sq
11cf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11d00 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  e(pInode->pLockM
11d10 75 74 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65  utex);.  release
11d20 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
11d30 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
11d40 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
11d50 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11d70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
11d80 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
11d90 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
11da0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11e10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11e80 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
11e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11eb0 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
11ec0 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
11ed0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
11ee0 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
11ef0 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
11f00 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
11f10 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
11f20 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
11f30 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
11f40 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
11f50 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
11f60 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
11f70 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
11f80 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
11f90 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
11fa0 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
11fb0 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
11fc0 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
11fd0 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
11fe0 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
11ff0 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
12000 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
12010 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
12020 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
12030 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
12040 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
12050 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
12060 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
12070 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
12080 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12090 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
120a0 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
120b0 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
120c0 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
120d0 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
120e0 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
120f0 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
12100 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
12110 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
12120 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
12130 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
12140 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
12150 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
12160 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
12170 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
12180 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
12190 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
121a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
121b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
121c0 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
121d0 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
121e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
121f0 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
12200 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12210 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
12220 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
12230 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
12240 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
12250 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
12260 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
12270 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
12280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12290 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
122a0 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
122b0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
122c0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
122d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
122e0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
122f0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
12300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12310 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
12320 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
12330 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
12340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12350 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
12360 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
12370 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12380 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12390 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
123a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12460 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12480 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
12490 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
124a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124b0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
124c0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
124d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
124e0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
124f0 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
12500 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
12510 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
12520 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
12530 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
12540 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
12550 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
12560 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
12570 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
12580 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
12590 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
125a0 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
125b0 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
125c0 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
125d0 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
125e0 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
125f0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
12600 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
12610 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
12620 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
12630 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
12640 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
12650 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
12660 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
12670 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
12680 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
12690 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
126a0 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
126b0 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
126c0 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
126d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
126e0 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
126f0 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
12700 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
12710 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
12720 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
12730 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
12740 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
12750 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
12760 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
12770 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12780 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
12790 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
127a0 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
127b0 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
127c0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
127d0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
127e0 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
127f0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
12800 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
12810 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
12820 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
12830 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
12840 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
12850 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
12860 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
12870 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
12880 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
12890 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
128a0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
128b0 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
128c0 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
128d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
128e0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
128f0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12900 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12910 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12920 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
12930 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
12940 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
12950 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
12960 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
12970 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
12980 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12990 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
129a0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
129b0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
129c0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
129d0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
129e0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
129f0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
12a00 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
12a10 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
12a20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
12a30 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
12a40 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
12a50 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
12a60 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
12a70 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
12a80 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
12a90 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
12aa0 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
12ab0 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
12ac0 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
12ad0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
12ae0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12af0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12b00 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
12b10 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12b30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12b40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12b50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12b60 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12b70 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12b80 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12b90 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12ba0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12bb0 65 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20  e );.  reserved 
12bc0 3d 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73  = osAccess((cons
12bd0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
12be0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30  ockingContext, 0
12bf0 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28  )==0;.  OSTRACE(
12c00 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
12c10 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
12c20 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12c30 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12c40 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12c50 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12c60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12c70 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12c80 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12c90 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12ca0 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12cb0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12cc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12cd0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12ce0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12cf0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12d00 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12d10 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12d20 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12d30 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12d40 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12d50 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12d60 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12d70 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12d80 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12d90 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12da0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12db0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12dc0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12dd0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12de0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12df0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12e00 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12e10 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12e20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12e30 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12e40 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12e50 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12e60 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12e70 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12e80 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12e90 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12ea0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12eb0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
12ec0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12ed0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
12ee0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
12ef0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12f00 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
12f10 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12f20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
12f30 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
12f40 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
12f50 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
12f60 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
12f70 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
12f80 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
12f90 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
12fa0 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
12fb0 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
12fc0 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
12fd0 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
12fe0 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
12ff0 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
13000 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
13010 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
13020 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13030 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13040 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13050 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13060 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
13070 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
13080 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
13090 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
130a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
130b0 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
130c0 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
130d0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
130e0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
130f0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
13100 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
13110 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
13120 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
13130 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
13140 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13150 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
13160 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13170 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13180 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
13190 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
131a0 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
131b0 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
131c0 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
131d0 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
131e0 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
131f0 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
13200 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
13210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13220 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13230 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
13240 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
13250 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
13260 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
13270 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
13280 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
13290 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
132a0 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
132b0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
132c0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
132d0 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
132e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
132f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
13300 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
13310 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13320 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13330 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13340 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
13350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
13360 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
13370 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
13380 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
13390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
133a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
133b0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
133c0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
133d0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
133e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
133f0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
13400 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13410 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13420 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13430 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13440 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13450 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13460 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13470 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13480 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13490 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
134a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
134b0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
134c0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
134d0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
134e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
134f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13500 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
13510 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
13520 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
13530 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
13540 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
13550 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13560 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13570 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13580 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13590 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
135a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
135b0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
135c0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
135d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
135e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
135f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13600 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
13610 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13620 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
13630 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
13640 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
13650 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
13660 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
13670 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
13680 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
13690 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
136a0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
136b0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
136c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
136d0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
136e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
136f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
13700 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
13710 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
13720 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
13730 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
13740 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
13750 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
13760 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
13770 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
13780 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
13790 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
137a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
137b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
137c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
137d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
137e0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
137f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
13800 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
13810 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
13820 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
13830 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
13840 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
13850 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
13860 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
13870 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
13880 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29  tErrno==ENOENT )
13890 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
138a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
138c0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
138d0 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
138e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
138f0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13900 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13910 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13920 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13940 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13950 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
13960 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
13970 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
13980 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
13990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
139a0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
139b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
139c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
139d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
139e0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
139f0 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55  =0 );.  dotlockU
13a00 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
13a10 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  K);.  sqlite3_fr
13a20 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
13a30 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74  gContext);.  ret
13a40 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13a50 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  e(id);.}./******
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13a70 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
13a80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13a90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b60 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
13b70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13ba0 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
13bb0 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
13bc0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
13bd0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
13be0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
13bf0 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
13c00 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
13c10 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
13c20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
13c30 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
13c40 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
13c50 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
13c60 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
13c70 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
13c80 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
13c90 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
13ca0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
13cb0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
13cc0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13cd0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
13ce0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
13cf0 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
13d00 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
13d10 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
13d20 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
13d30 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
13d40 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
13d50 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
13d60 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
13d70 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
13d80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13d90 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
13da0 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ff.*/.#if SQLITE
13db0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
13dc0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  STYLE../*.** Ret
13dd0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
13de0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
13df0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
13e00 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
13e10 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
13e20 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
13e30 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
13e40 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
13e50 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
13e60 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
13e70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13e80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13e90 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
13ea0 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
13eb0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
13ec0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13ed0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13ee0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13ef0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13f00 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13f10 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13f20 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13f30 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13f40 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13f50 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13f60 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13f70 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13f80 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13f90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13fa0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13fb0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13fc0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13fd0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13fe0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13ff0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
14000 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
14010 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14020 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
14030 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14040 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14050 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
14060 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14070 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
14080 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
140a0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
140b0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
140c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
140d0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
140e0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
140f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
14100 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
14110 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14120 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
14130 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
14140 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14150 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14160 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14170 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
14180 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14190 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
141a0 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
141b0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
141c0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
141d0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
141e0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
141f0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
14200 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
14210 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
14220 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
14230 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
14240 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
14250 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
14260 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
14270 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14280 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
14290 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
142a0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
142b0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
142c0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
142d0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
142e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
142f0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
14300 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
14310 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14320 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14330 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
14340 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
14350 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
14360 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
14370 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
14380 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
14390 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
143a0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
143b0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
143c0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
143d0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
143e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
143f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14400 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
14410 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14420 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
14430 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
14440 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
14450 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14460 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14470 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14480 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14490 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
144a0 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51  rc & 0xff) == SQ
144b0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
144c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
144d0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
144e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
144f0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14500 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
14510 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
14520 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14530 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14540 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14550 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14560 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14570 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14580 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14590 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
145a0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
145b0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
145c0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
145d0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
145e0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
145f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
14600 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
14610 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14620 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14630 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14640 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14650 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14660 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14670 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14680 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14690 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
146a0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
146b0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
146c0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
146d0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
146e0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
146f0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
14700 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
14710 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14720 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14730 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14740 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14750 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14760 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14770 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14780 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14790 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
147a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
147b0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
147c0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
147d0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
147e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
147f0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
14800 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
14810 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
14820 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
14830 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
14840 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
14850 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
14860 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
14870 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
14880 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
14890 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
148a0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
148b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
148c0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
148d0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
148e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
148f0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
14900 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
14910 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
14920 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
14930 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
14940 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
14950 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
14960 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14970 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14980 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
149a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
149b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
149c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
149d0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
149e0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
149f0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
14a00 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
14a10 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
14a20 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
14a30 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
14a40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
14a50 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
14a60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14a70 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14a90 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
14aa0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
14ab0 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
14ac0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
14ad0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
14ae0 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
14af0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14b00 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
14b10 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
14b20 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
14b30 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14b40 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14b50 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14b60 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
14b70 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14b80 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
14b90 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14ba0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
14bb0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
14bc0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14bd0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14be0 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
14bf0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14c00 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
14c10 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
14c20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
14c30 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14c40 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
14c50 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
14c60 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
14c70 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
14c80 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
14c90 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14ca0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
14cb0 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
14cc0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
14cd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14ce0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
14cf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
14d00 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14d10 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
14d20 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14d30 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
14d40 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
14d50 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
14d60 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
14d70 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
14d80 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
14d90 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
14da0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
14db0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14dc0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14dd0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14de0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
14df0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
14e00 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14e10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14e20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14e30 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
14e40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14e50 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14e60 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14e70 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14e80 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
14e90 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
14ea0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
14eb0 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
14ec0 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
14ed0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
14ee0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
14ef0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14f00 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
14f10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
14f20 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
14f30 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
14f40 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
14f50 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14f60 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
14f70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
14f80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14f90 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
14fa0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
14fb0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
14fc0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
14fd0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
14fe0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
14ff0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
15000 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
15010 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
15020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15030 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
15040 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
15050 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
15060 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15070 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
15080 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
15090 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
150a0 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
150b0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
150c0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
150d0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
150e0 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
150f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
15100 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
15110 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15120 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15140 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15150 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
15160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15170 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
15180 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61  _file *id) {.  a
15190 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
151a0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
151b0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65  , NO_LOCK);.  re
151c0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
151d0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
151e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
151f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
15200 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
15210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15220 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
15230 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
15240 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
152c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15300 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15320 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
15330 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
15340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15350 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
15360 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
15370 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
15380 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
15390 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
153a0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
153b0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
153c0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
153d0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
153e0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
153f0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
15400 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
15410 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
15420 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
15430 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
15440 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
15450 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
15460 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
15470 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
15480 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
15490 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
154a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
154b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
154c0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
154d0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
154e0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
154f0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
15500 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
15510 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15520 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15530 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15540 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15550 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15560 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15570 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15580 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15590 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
155a0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
155b0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
155c0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
155d0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
155e0 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65   int semXCheckRe
155f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
15600 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15610 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
15620 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15630 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
15640 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
15650 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15660 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
15670 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
15680 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15690 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
156a0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
156b0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
156c0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
156d0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
156e0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
156f0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
15700 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15710 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
15720 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
15730 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
15740 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
15750 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15760 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
15770 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15780 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
15790 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
157a0 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69  de->pSem;..    i
157b0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
157c0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
157d0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
157e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
157f0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
15800 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15810 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15820 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15830 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15840 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15850 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
15860 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15870 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
15880 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15890 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
158a0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
158b0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
158c0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
158d0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
158e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
158f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
15900 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15910 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
15920 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
15930 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
15940 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
15950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
15960 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
15970 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
15980 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
15990 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
159a0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
159b0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
159c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
159d0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
159e0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
159f0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
15a00 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
15a10 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
15a20 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
15a30 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
15a40 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
15a50 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
15a60 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
15a70 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
15a80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
15a90 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
15aa0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
15ab0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
15ac0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
15ad0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
15ae0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
15af0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
15b00 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
15b10 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
15b20 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
15b30 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
15b40 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
15b50 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
15b60 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
15b70 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
15b80 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15b90 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
15ba0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
15bb0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
15bc0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
15bd0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
15be0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
15bf0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
15c00 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
15c10 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15c20 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15c30 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
15c40 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
15c50 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15c60 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
15c70 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
15c80 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
15c90 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
15ca0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
15cb0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
15cc0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
15cd0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
15ce0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
15cf0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
15d00 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
15d10 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
15d20 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
15d30 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
15d40 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
15d50 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
15d60 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
15d70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15d80 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
15d90 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
15da0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
15db0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
15dc0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
15dd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
15de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15df0 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  mXLock(sqlite3_f
15e00 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15e10 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
15e20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15e30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
15e40 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
15e50 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
15e60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
15e70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
15e80 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
15e90 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
15ea0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
15eb0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
15ec0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
15ed0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
15ee0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
15ef0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
15f00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
15f10 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
15f20 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
15f30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
15f40 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
15f50 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
15f60 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
15f70 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
15f80 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
15f90 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
15fa0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
15fb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15fc0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
15fd0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
15fe0 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
15ff0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
16000 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
16010 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16020 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
16030 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
16040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16050 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16060 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16070 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16080 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
16090 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
160a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
160b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
160c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
160d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
160e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
160f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16100 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16110 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16120 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16130 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16140 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16150 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c  atic int semXUnl
16160 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16170 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16180 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
16190 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
161a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
161b0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
161c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
161d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
161e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
161f0 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
16200 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
16210 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
16220 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
16230 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
16240 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
16250 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
16260 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
16270 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
16280 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
16290 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
162a0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
162b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
162c0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
162d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
162e0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
162f0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
16300 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
16310 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
16320 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
16330 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
16340 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
16350 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16360 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
16370 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16380 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
16390 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
163a0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
163b0 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
163c0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
163d0 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
163e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
163f0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16400 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
16410 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
16420 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16430 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
16440 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16450 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16460 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
16470 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
16480 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16490 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
164a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
164b0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
164c0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
164d0 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73  tic int semXClos
164e0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
164f0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
16500 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
16510 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16520 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55  e*)id;.    semXU
16530 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
16540 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
16550 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  pFile );.    ass
16560 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
16570 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29  exNotheld(pFile)
16580 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
16590 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
165a0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
165b0 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
165c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
165d0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
165e0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
165f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
16600 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
16610 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
16620 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
16630 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
16640 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
16650 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
16660 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
16670 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
16680 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
16690 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
166a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
166b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
16700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16740 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16760 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
16770 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
16780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16790 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
167a0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
167b0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
167c0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
167d0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
167e0 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
167f0 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
16800 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
16810 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
16820 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
16830 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
16840 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
16850 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
16860 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
16870 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
16880 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16890 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
168a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
168b0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
168c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
168d0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
168e0 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
168f0 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
16900 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16910 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16920 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
16930 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
16940 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
16950 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
16960 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
16970 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
16980 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16990 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
169a0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
169b0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
169c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
169d0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
169e0 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
169f0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
16a00 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16a10 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
16a20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
16a30 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16a40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16a50 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
16a60 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
16a70 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
16a80 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
16a90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
16aa0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
16ab0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
16ac0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
16ad0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16ae0 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
16af0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
16b00 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
16b10 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
16b20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
16b50 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
16b60 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
16b70 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
16b80 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
16b90 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
16ba0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
16bb0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
16bc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
16bd0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
16be0 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
16bf0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
16c00 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
16c10 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
16c20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16c30 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
16c40 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
16c50 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
16c60 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
16c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
16c80 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
16c90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16ca0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
16cb0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
16cc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16cd0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16ce0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
16cf0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
16d00 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
16d10 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
16d20 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
16d30 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
16d40 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16d50 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
16d60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16d70 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
16d80 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
16d90 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
16da0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
16db0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
16dc0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
16dd0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
16de0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
16df0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
16e00 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
16e10 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
16e20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
16e30 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
16e40 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
16e50 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
16e60 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
16e70 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
16e80 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
16e90 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
16ea0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
16eb0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
16ec0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
16ed0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
16ee0 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
16ef0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
16f00 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
16f10 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
16f20 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
16f30 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
16f40 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
16f50 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
16f60 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
16f70 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
16f80 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
16f90 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
16fa0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
16fb0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
16fc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16fd0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
16fe0 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
16ff0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17000 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
17010 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
17020 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
17030 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
17040 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
17050 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
17080 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
17090 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
170a0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
170b0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
170c0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
170d0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
170e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
170f0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
17100 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
17110 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
17120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
17130 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
17140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17160 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17170 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
17180 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
17190 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
171a0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
171b0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
171c0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
171d0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
171e0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
171f0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
17200 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
17210 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
17220 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
17230 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
17240 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
17250 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
17260 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
17270 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
17280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
17290 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
172a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
172b0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
172c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
172d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
172e0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
172f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17300 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17310 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
17320 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
17330 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17340 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17350 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
17360 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
17370 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17380 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
17390 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
173a0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
173b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
173c0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
173d0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
173e0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
173f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17400 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
17410 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d  tex_enter(pFile-
17420 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  >pInode->pLockMu
17430 74 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  tex);.  /* Check
17440 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
17450 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
17460 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
17470 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
17480 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17490 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
174a0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
174b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
174c0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
174d0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
174e0 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
174f0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
17500 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
17510 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
17520 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
17530 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17540 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17550 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17560 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
17570 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
17580 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
17590 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
175a0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
175b0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
175c0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
175d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
175e0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
175f0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
17600 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17610 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17620 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17630 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
17640 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
17650 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
17660 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
17670 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
17680 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
17690 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
176a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
176b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
176c0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
176d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
176e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
176f0 65 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  eave(pFile->pIno
17700 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
17710 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
17720 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
17730 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
17740 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
17750 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
17760 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
17770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17780 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
17790 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
177a0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
177b0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
177c0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
177d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
177e0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
177f0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
17800 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
17810 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
17820 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
17830 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
17840 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
17850 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
17860 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
17870 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
17880 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
17890 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
178a0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
178b0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
178c0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
178d0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
178e0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
178f0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
17900 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
17910 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
17920 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
17930 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
17940 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
17950 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
17960 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
17970 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
17980 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
17990 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
179a0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
179b0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
179c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
179d0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
179e0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
179f0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
17a00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
17a10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
17a20 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
17a30 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
17a40 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
17a50 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
17a60 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
17a70 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
17a80 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
17a90 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
17aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17ab0 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
17ac0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17ad0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
17ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17af0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17b00 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17b10 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
17b20 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
17b30 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
17b40 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17b50 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
17b60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
17b70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
17b80 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
17b90 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17ba0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17bb0 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
17bc0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
17bd0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
17be0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17bf0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
17c00 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
17c10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
17c20 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17c30 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
17c40 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
17c50 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
17c60 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
17c70 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
17c80 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
17c90 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
17ca0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
17cb0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
17cc0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
17cd0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
17ce0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
17cf0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
17d00 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
17d10 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
17d20 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
17d30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17d40 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
17d50 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
17d60 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
17d70 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
17d80 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17d90 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
17da0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
17db0 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
17dc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17dd0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
17de0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
17df0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
17e00 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
17e10 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
17e20 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
17e30 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
17e40 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
17e50 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
17e60 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
17e70 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
17e80 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
17e90 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
17ea0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
17eb0 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
17ec0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
17ed0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
17ee0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
17ef0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
17f00 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
17f10 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17f20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
17f30 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
17f40 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
17f50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
17f60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17f70 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
17f80 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
17f90 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
17fa0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
17fb0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
17fc0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
17fd0 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
17fe0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
17ff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18000 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
18010 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
18020 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
18030 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
18040 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
18050 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
18060 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
18070 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
18080 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
18090 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
180a0 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
180b0 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
180c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
180d0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
180e0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
180f0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
18100 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
18110 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
18120 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18130 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
18140 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
18150 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
18160 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
18170 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
18180 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
18190 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
181a0 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
181b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
181c0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
181d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
181e0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
181f0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
18200 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
18210 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
18220 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
18230 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18240 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18250 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
18260 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
18270 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
18280 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
182a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
182b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
182c0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
182d0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
182e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
182f0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
18300 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
18310 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
18320 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
18330 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18340 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
18350 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
18360 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
18370 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
18380 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
18390 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
183a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
183b0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
183c0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
183d0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
183e0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
183f0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
18400 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
18410 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
18420 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18430 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
18440 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
18450 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
18460 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
18470 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
18480 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18490 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
184a0 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
184b0 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
184c0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
184d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
184e0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
184f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
18500 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
18510 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
18520 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
18530 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
18540 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
18550 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
18560 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
18570 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
18580 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18590 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
185a0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
185b0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
185c0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
185d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
185e0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
185f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
18600 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
18610 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
18620 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
18630 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
18640 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
18650 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
18660 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
18670 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
18680 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
18690 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
186a0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
186b0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
186c0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
186d0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
186e0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
186f0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
18700 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
18710 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
18720 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
18730 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18740 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
18750 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
18760 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
18770 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
18780 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18790 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
187a0 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
187b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
187c0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
187d0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
187e0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
187f0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
18800 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18810 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
18820 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
18830 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
18840 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
18850 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
18860 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
18870 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
18880 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
18890 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
188a0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
188b0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
188c0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
188d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
188e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
188f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18900 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
18910 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
18920 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
18930 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18940 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18950 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18960 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
18970 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
18980 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18990 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
189a0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
189b0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
189c0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
189d0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
189e0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
189f0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
18a00 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
18a10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
18a20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
18a30 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
18a40 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
18a50 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
18a60 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18a70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
18a80 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
18a90 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
18aa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18ab0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
18ac0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
18ad0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
18ae0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
18af0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
18b00 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
18b10 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
18b20 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
18b30 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
18b40 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
18b50 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
18b60 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
18b70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
18b80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
18b90 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
18ba0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
18bb0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
18bc0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
18bd0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18be0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
18bf0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
18c00 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
18c10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
18c20 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
18c30 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18c40 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
18c50 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
18c60 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
18c70 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
18c80 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
18c90 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
18ca0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
18cb0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
18cc0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
18cd0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
18ce0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
18cf0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
18d00 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18d10 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
18d20 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
18d30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18d40 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
18d50 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18d60 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18d70 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
18da0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
18db0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
18dc0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
18dd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18de0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
18df0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
18e00 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
18e10 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
18e20 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
18e30 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18e40 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
18e50 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
18e80 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
18e90 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
18ea0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
18eb0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18ec0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
18ef0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
18f00 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
18f10 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
18f20 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
18f30 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
18f40 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
18f50 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
18f60 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
18f70 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
18f80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18f90 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
18fa0 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  d & 0xff) == SQL
18fb0 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
18fc0 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
18fd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
18fe0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
18ff0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19000 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
19010 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
19020 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
19030 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
19040 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
19050 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
19060 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19070 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
19080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19090 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
190a0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
190b0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
190c0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
190d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
190e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
190f0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
19100 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
19110 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
19120 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19130 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
19140 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
19150 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
19160 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19170 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
19180 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
19190 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
191a0 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
191b0 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
191c0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
191d0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
191e0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
191f0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
19200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19210 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
19220 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
19230 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
19240 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
19250 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
19260 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
19270 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
19280 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
19290 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
192a0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
192b0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
192c0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
192d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
192e0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
192f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
19300 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
19310 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
19320 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19330 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
19340 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19350 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19360 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19370 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
19380 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
19390 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
193a0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
193b0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
193c0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
193d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
193e0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
193f0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
19400 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
19410 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
19420 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
19430 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
19440 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
19450 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
19460 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
19470 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
19480 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
19490 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
194a0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
194b0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
194c0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
194d0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  ed,.           o
194e0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
194f0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
19500 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
19510 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
19520 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
19530 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
19540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19550 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  }.  pInode = pFi
19560 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
19570 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19580 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
19590 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
195a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
195b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
195c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
195d0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
195e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
195f0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
19600 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
19610 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19620 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19630 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19640 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
19650 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
19660 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
19670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19680 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
19690 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
196a0 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
196b0 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
196c0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
196d0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
196e0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
196f0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
19700 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
19710 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
19720 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
19730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19740 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
19750 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
19760 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19770 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
19780 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
19790 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
197a0 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
197b0 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
197c0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
197d0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
197e0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
197f0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
19800 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
19810 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
19820 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
19830 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
19840 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
19850 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19860 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
19870 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
19880 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19890 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
198a0 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
198b0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
198c0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
198d0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
198e0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
198f0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
19900 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
19910 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
19920 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
19930 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19940 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
19950 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
19960 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
19970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19980 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
19990 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
199a0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
199b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
199c0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
199d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
199e0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
199f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
19a00 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
19a10 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
19a20 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
19a30 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
19a40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19a50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
19a60 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
19a70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
19a80 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
19a90 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
19aa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ac0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
19ad0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
19ae0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
19af0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19b00 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19b10 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
19b20 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
19b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19b40 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
19b50 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
19b60 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
19b70 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
19b80 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
19b90 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19ba0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
19bb0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
19bc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
19bd0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
19be0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
19bf0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
19c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
19c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
19c20 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19c30 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
19c40 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
19c50 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
19c60 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
19c70 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
19c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19c90 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
19ca0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
19cb0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19cc0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
19cd0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
19ce0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
19cf0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
19d00 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
19d10 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
19d20 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
19d30 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
19d40 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
19d50 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
19d60 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
19d70 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
19d80 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
19d90 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
19da0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
19db0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
19dc0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
19dd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19de0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
19df0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19e00 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
19e10 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19e20 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
19e30 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
19e40 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
19e50 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
19e60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19e70 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
19e80 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
19e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19ea0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
19eb0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19ec0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
19ed0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
19ee0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
19ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
19f20 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
19f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19f40 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
19f50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
19f60 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63  de->nLock==0 ) c
19f70 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
19f80 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
19f90 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .  .  sqlite3_mu
19fa0 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
19fb0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
19fc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19fd0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
19fe0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
19ff0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
1a000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a010 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
1a020 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
1a030 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
1a040 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
1a050 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
1a060 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
1a070 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a080 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1a090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a0a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
1a0b0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1a0c0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1a0d0 5f 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74  _LOCK);.  assert
1a0e0 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  ( unixFileMutexN
1a0f0 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b  otheld(pFile) );
1a100 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1a110 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1a120 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ->pInode ){.    
1a130 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1a140 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1a150 49 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74  Inode;.    sqlit
1a160 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a170 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
1a180 78 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  x);.    if( pIno
1a190 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1a1a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1a1b0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1a1c0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1a1d0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1a1e0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1a1f0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1a200 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1a210 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1a220 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1a230 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1a240 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1a250 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1a260 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1a270 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1a280 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1a290 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1a2a0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1a2b0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1a2c0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1a2d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a2e0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
1a2f0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d  pLockMutex);.  }
1a300 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
1a310 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71  nfo(pFile);.  sq
1a320 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
1a330 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1a340 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
1a350 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
1a360 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1a370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a380 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1a390 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a3a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a3b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1a3c0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1a3d0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
1a3e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a3f0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1a400 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1a410 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1a420 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1a430 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1a440 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1a450 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1a460 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
1a470 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
1a480 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
1a490 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
1a4a0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1a4b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1a4d0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
1a4e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a500 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1a560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5c0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
1a5d0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1a5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5f0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
1a600 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a610 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a620 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
1a630 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
1a640 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
1a650 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
1a660 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
1a670 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
1a680 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
1a690 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
1a6a0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
1a6b0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1a6c0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1a6d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1a6e0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1a6f0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
1a700 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1a710 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1a720 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
1a730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
1a740 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1a750 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
1a760 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
1a770 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
1a780 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
1a790 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1a7a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a7b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1a7c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a7d0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1a7e0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
1a7f0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1a800 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1a810 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1a820 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1a830 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1a840 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1a850 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1a860 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1a870 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
1a880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a890 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
1a8a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1a8b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1a920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1a970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
1a980 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
1a990 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
1a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1a9c0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
1a9d0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
1a9e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
1a9f0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
1aa00 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
1aa10 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
1aa20 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
1aa30 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
1aa40 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
1aa50 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
1aa60 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
1aa70 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
1aa80 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
1aa90 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
1aaa0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
1aab0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
1aac0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
1aad0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
1aae0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
1aaf0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
1ab00 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1ab10 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
1ab20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1ab30 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
1ab40 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
1ab50 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
1ab60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ab70 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1ab80 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
1ab90 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
1aba0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
1abb0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
1abc0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
1abd0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
1abe0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
1abf0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
1ac00 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
1ac10 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
1ac20 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
1ac30 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
1ac40 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
1ac50 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
1ac60 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
1ac70 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1ac80 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1ac90 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
1aca0 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
1acb0 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
1acc0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1acd0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1ace0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
1acf0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1ad00 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1ad10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1ad20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1ad30 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
1ad40 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
1ad50 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
1ad60 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1ad70 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1ad80 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
1ad90 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
1ada0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
1adb0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1adc0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
1add0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
1ade0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
1adf0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
1ae00 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
1ae10 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
1ae20 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
1ae30 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
1ae40 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
1ae50 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1ae60 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1ae70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1ae80 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
1ae90 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1aea0 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
1aeb0 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
1aec0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1aed0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1aee0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1aef0 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
1af00 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
1af10 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
1af20 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1af30 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1af40 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20   newOffset = -1 
1af50 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
1af60 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  fset<0 ){.      
1af70 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1af80 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1af90 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
1afa0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1afb0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
1afc0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
1afd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1afe0 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b  got==cnt ) break
1aff0 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20  ;.    if( got<0 
1b000 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
1b010 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74  no==EINTR ){ got
1b020 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20   = 1; continue; 
1b030 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20  }.      prior = 
1b040 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  0;.      storeLa
1b050 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1b060 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a  e*)id,  errno);.
1b070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b080 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30   }else if( got>0
1b090 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d   ){.      cnt -=
1b0a0 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73   got;.      offs
1b0b0 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  et += got;.     
1b0c0 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20   prior += got;. 
1b0d0 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69       pBuf = (voi
1b0e0 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a  d*)(got + (char*
1b0f0 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  )pBuf);.    }.  
1b100 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b  }while( got>0 );
1b110 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1b120 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
1b130 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1b140 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20   %llu\n",.      
1b150 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74        id->h, got
1b160 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70  +prior, offset-p
1b170 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50  rior, TIMER_ELAP
1b180 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
1b190 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a  got+prior;.}../*
1b1a0 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1b1b0 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
1b1c0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
1b1d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1b1e0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
1b1f0 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
1b200 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
1b210 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
1b220 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
1b230 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1b240 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
1b250 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
1b260 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1b270 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1b280 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
1b290 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b2a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1b2b0 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
1b2c0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1b2d0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
1b2e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
1b2f0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1b300 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1b310 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1b320 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1b330 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1b340 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1b350 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1b360 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1b370 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1b380 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1b390 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1b3a0 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
1b3b0 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  tedUnused==0.   
1b3c0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1b3d0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1b3e0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b3f0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1b400 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1b410 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1b420 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1b430 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1b440 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
1b450 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1b460 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1b470 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1b480 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1b490 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1b4a0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1b4b0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1b4c0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1b4d0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1b4e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b4f0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1b500 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1b510 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1b520 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1b530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b550 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1b560 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1b570 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1b580 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1b590 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1b5a0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1b5b0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1b5c0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1b5d0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1b5e0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1b5f0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1b600 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1b610 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b620 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1b630 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1b640 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1b650 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1b660 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1b680 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1b690 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1b6a0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1b6b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1b6c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1b6d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b6e0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1b6f0 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f  ile, 0);   /* no
1b700 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b710 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1b720 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1b730 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1b740 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1b750 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1b760 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1b770 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1b780 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b790 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1b7a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1b7b0 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
1b7c0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1b7d0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1b7e0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1b7f0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1b800 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1b810 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1b820 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1b830 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1b840 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1b850 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1b860 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1b870 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1b880 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1b890 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1b8a0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1b8b0 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1b8c0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1b8d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1b8e0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1b8f0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1b920 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1b930 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1b960 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1b970 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1b980 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1b990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b9a0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1b9b0 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1b9c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1b9d0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1b9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b9f0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1ba00 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1ba10 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1ba40 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1ba50 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1ba60 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba80 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1ba90 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1baa0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1bab0 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1bac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64   );.  assert( fd
1bad0 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >2 );.  assert( 
1bae0 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20  piErrno!=0 );.  
1baf0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1bb00 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1bb10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1bb20 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1bb30 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1bb40 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1bb50 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1bb60 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1bb70 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1bb80 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1bb90 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  4).  do{ rc = (i
1bba0 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64  nt)osPwrite64(fd
1bbb0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1bbc0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1bbd0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1bbe0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1bbf0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1bc00 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1bc10 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1bc20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1bc30 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20  Seek = -1 );.   
1bc40 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a   if( iSeek<0 ){.
1bc50 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1bc60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bc70 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69  }.    rc = osWri
1bc80 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1bc90 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  f);.  }while( rc
1bca0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1bcb0 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  TR );.#endif..  
1bcc0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
1bcd0 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
1bce0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
1bcf0 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69  lu\n", fd, rc, i
1bd00 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  Off, TIMER_ELAPS
1bd10 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c  ED));..  if( rc<
1bd20 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  0 ) *piErrno = e
1bd30 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1bd40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1bd50 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1bd60 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1bd70 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1bd80 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1bd90 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1bda0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1bdb0 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1bdc0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1bdd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1bde0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1bdf0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1be00 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1be10 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1be20 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1be30 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1be40 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1be50 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1be60 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1be70 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1be80 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1be90 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1bea0 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1beb0 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1bec0 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1bed0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1bee0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1bef0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1bf00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1bf10 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1bf20 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1bf30 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1bf40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1bf50 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1bf60 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1bf70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1bf80 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1bf90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1bfa0 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1bfb0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1bfc0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1bfd0 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1bfe0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1bff0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1c000 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1c010 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1c020 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1c030 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1c040 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1c050 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1c060 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1c070 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1c080 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1c090 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1c0a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1c0b0 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1c0c0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1c0d0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1c0e0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1c0f0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1c100 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1c110 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1c120 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c130 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1c140 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1c150 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1c160 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1c170 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1c180 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1c190 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1c1a0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1c1b0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1c1c0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1c1d0 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1c1e0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1c1f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1c200 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1c210 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1c220 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1c230 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1c240 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1c250 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1c260 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1c270 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1c280 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1c290 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c2a0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1c2b0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1c2c0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1c2d0 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1c2e0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1c2f0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1c300 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c310 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1c320 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1c330 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1c340 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1c350 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c360 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1c370 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1c380 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1c390 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1c3a0 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1c3b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1c3c0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1c3d0 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1c3e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1c3f0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1c400 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1c410 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1c420 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c430 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1c440 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1c450 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1c460 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1c470 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1c480 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1c490 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1c4a0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1c4b0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1c4c0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1c4d0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1c4e0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1c4f0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1c500 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1c510 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c520 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1c530 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1c540 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1c550 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1c560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c580 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1c590 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1c5a0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1c5b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1c5c0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1c5d0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1c5e0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1c5f0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1c600 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1c610 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1c620 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1c630 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1c640 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c650 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1c660 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1c670 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1c680 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1c690 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1c6a0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1c6b0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1c6c0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1c6d0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1c6e0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1c6f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1c700 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1c710 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1c720 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1c730 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1c740 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1c750 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1c760 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1c770 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1c780 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1c790 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1c7a0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1c7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c7c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1c7d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c7e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1c7f0 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1c800 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1c810 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1c820 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1c830 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1c840 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c860 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1c870 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1c880 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1c890 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1c8a0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1c8b0 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1c8c0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1c8d0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1c8e0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1c8f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1c900 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1c910 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1c920 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1c930 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1c940 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1c950 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1c960 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1c970 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1c980 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1c990 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1c9a0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1c9b0 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1c9c0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1c9d0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1c9e0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1c9f0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1ca00 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1ca10 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1ca20 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1ca30 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1ca40 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1ca50 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1ca60 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1ca70 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1ca80 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1ca90 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1caa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1cab0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1cac0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1cad0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1cae0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1caf0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1cb00 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1cb10 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1cb20 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1cb30 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1cb40 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1cb50 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1cb60 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1cb70 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1cb80 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1cb90 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1cba0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1cbb0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1cbc0 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1cbd0 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1cbe0 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1cbf0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1cc00 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1cc10 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1cc20 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1cc30 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1cc40 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1cc50 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1cc60 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1cc70 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1cc80 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1cc90 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1cca0 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1ccb0 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1ccc0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1ccd0 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1cce0 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1ccf0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1cd00 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1cd10 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1cd20 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1cd30 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1cd40 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1cd50 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1cd60 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1cd70 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1cd80 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1cd90 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1cda0 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1cdb0 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1cdc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1cdd0 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1cde0 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1cdf0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1ce00 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1ce10 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1ce20 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1ce30 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1ce40 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1ce50 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1ce60 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1ce70 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1ce80 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1ce90 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1cea0 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1ceb0 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1cec0 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1ced0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1cee0 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1cef0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1cf00 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1cf10 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1cf20 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1cf30 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1cf40 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1cf50 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1cf60 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1cf70 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1cf80 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1cf90 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1cfa0 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1cfb0 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1cfc0 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1cfd0 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1cfe0 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1cff0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1d000 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1d010 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1d020 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1d030 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1d040 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1d050 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1d060 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1d070 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1d080 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1d090 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1d0a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d0b0 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1d0c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1d0d0 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1d0e0 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1d0f0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1d100 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1d110 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1d120 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1d130 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1d140 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1d150 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1d160 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1d170 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1d180 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1d190 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1d1a0 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1d1b0 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1d1c0 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1d1d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d1e0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1d1f0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1d200 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d210 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1d220 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d230 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1d240 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d250 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1d260 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1d270 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1d280 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d290 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d2a0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d2b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1d2c0 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1d2d0 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1d2e0 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1d2f0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1d300 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1d310 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1d320 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1d330 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1d340 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1d350 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1d360 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1d370 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d380 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1d390 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1d3a0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1d3b0 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1d3c0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1d3d0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1d3e0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1d3f0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1d400 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1d410 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1d420 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65  -op.  But go ahe
1d430 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61  ad and call fsta
1d440 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20  t() to validate 
1d450 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  the file.  ** de
1d460 73 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e  scriptor as we n
1d470 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20  eed a method to 
1d480 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72  provoke a failur
1d490 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f  e during.  ** co
1d4a0 76 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a  verate testing..
1d4b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d4c0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20  TE_NO_SYNC.  {. 
1d4d0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1d4e0 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  uf;.    rc = osF
1d4f0 73 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a  stat(fd, &buf);.
1d500 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46    }.#elif HAVE_F
1d510 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1d520 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1d530 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1d540 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1d550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1d560 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1d570 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1d580 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1d590 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1d5a0 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1d5b0 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1d5c0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1d5d0 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1d5e0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1d5f0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1d600 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1d610 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1d620 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1d630 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1d640 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1d650 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1d660 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1d670 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1d680 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1d690 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1d6a0 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1d6b0 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1d6c0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1d6d0 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1d6e0 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1d6f0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1d700 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1d710 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1d720 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1d730 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1d740 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1d750 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1d760 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1d770 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1d780 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1d790 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1d7a0 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1d7b0 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1d7c0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1d7d0 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1d7e0 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1d7f0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1d800 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1d810 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1d820 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1d830 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1d840 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1d850 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1d860 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1d870 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1d880 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1d890 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1d8a0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1d8b0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d8c0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1d8d0 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1d8e0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1d8f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1d910 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1d920 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1d930 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1d940 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1d950 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1d960 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1d970 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1d980 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1d990 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1d9a0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1d9b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1d9c0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1d9d0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1d9e0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1d9f0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1da00 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1da10 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1da20 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1da30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1da40 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1da50 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1da60 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1da70 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1da80 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1da90 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1daa0 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1dab0 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1dac0 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1dad0 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1dae0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1daf0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1db00 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1db10 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1db20 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1db30 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1db40 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1db50 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1db60 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1db70 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1db80 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1db90 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1dba0 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1dbb0 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1dbc0 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1dbd0 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1dbe0 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1dbf0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1dc00 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1dc10 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1dc20 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1dc30 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1dc40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1dc50 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1dc60 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1dc70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1dc80 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1dc90 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1dca0 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1dcb0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1dcc0 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1dcd0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1dce0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1dcf0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dd00 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1dd10 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1dd20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1dd30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1dd40 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1dd50 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1dd60 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1dd70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1dd80 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1dd90 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1dda0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1ddb0 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1ddc0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1ddd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1dde0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1ddf0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1de00 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1de10 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1de20 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26  irname); ii>0 &&
1de30 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1de40 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1de50 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1de60 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1de70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1de80 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d  f( zDirname[0]!=
1de90 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30  '/' ) zDirname[0
1dea0 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69  ] = '.';.    zDi
1deb0 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20  rname[1] = 0;.  
1dec0 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  }.  fd = robust_
1ded0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
1dee0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
1def0 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  , 0);.  if( fd>=
1df00 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
1df10 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1df20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1df30 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46  ame));.  }.  *pF
1df40 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64  d = fd;.  if( fd
1df50 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=0 ) return SQL
1df60 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1df70 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1df80 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1df90 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f  PT, "openDirecto
1dfa0 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a  ry", zDirname);.
1dfb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1dfc0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1dfd0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1dfe0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1dff0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1e000 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1e010 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1e020 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1e030 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1e040 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1e050 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1e060 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1e070 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1e080 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1e090 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1e0a0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1e0b0 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1e0c0 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1e0d0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1e0e0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1e0f0 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1e100 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1e110 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1e120 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1e130 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1e140 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1e150 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1e160 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1e170 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1e180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1e190 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1e1a0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1e1b0 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1e1c0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1e1d0 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1e1e0 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1e1f0 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1e200 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1e210 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1e220 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1e230 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1e240 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e250 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1e260 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1e270 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1e280 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e2a0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1e2b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1e2c0 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1e2d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1e2e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1e2f0 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1e300 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1e310 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1e320 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1e330 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1e340 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1e350 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1e360 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1e370 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1e380 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1e390 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1e3a0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1e3b0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1e3c0 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1e3d0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1e3e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1e3f0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1e400 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1e410 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1e420 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1e430 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1e440 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1e450 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1e460 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1e470 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1e480 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1e490 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1e4a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1e4b0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1e4c0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1e4d0 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1e4e0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1e4f0 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1e500 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1e510 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1e520 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1e530 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1e540 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1e550 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1e560 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1e570 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1e580 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e590 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79  FSYNC, "full_fsy
1e5a0 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
1e5b0 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  h);.  }..  /* Al
1e5c0 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72  so fsync the dir
1e5d0 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1e5e0 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68  g the file if th
1e5f0 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20  e DIRSYNC flag. 
1e600 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69   ** is set.  Thi
1e610 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20  s is a one-time 
1e620 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e  occurrence.  Man
1e630 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70  y systems (examp
1e640 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61  les: AIX).  ** a
1e650 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79  re unable to fsy
1e660 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  nc a directory, 
1e670 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73  so ignore errors
1e680 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20   on the fsync.. 
1e690 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1e6a0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1e6b0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b  XFILE_DIRSYNC ){
1e6c0 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a  .    int dirfd;.
1e6d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49      OSTRACE(("DI
1e6e0 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66  RSYNC %s (have_f
1e6f0 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
1e700 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
1e710 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20  le->zPath,.     
1e720 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
1e730 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
1e740 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c));.    rc = os
1e750 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46  OpenDirectory(pF
1e760 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72  ile->zPath, &dir
1e770 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
1e780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e790 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
1e7a0 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  irfd, 0, 0);.   
1e7b0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
1e7c0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
1e7d0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
1e7e0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e7f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1e800 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
1e810 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e820 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1e830 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1e840 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1e850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1e870 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1e880 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1e890 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1e8a0 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1e8b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1e8c0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1e8d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1e8e0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1e8f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1e900 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1e910 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1e920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e930 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1e940 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1e950 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1e960 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1e970 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1e980 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1e990 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1e9a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1e9b0 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1e9c0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1e9d0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1e9e0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1e9f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1ea00 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1ea10 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1ea20 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1ea30 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1ea40 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
1ea50 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1ea60 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1ea70 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1ea80 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1ea90 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1eaa0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1eab0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1eac0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ead0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1eae0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1eaf0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1eb00 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1eb10 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1eb20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1eb30 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1eb40 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1eb50 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1eb60 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1eb70 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1eb80 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1eb90 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1eba0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1ebb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1ebc0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1ebd0 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1ebe0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1ebf0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1ec00 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1ec10 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1ec20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1ec30 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1ec40 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1ec50 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1ec60 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1ec70 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1ec80 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1ec90 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1eca0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1ecb0 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1ecc0 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1ecd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1ece0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1ecf0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1ed00 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1ed10 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1ed20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ed30 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1ed40 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
1ed50 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1ed60 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
1ed70 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
1ed80 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1ed90 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
1eda0 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
1edb0 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1edc0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
1edd0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
1ede0 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
1edf0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
1ee00 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
1ee10 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
1ee20 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
1ee30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ee40 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
1ee50 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
1ee60 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1ee70 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
1ee80 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1ee90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1eea0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1eeb0 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1eec0 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1eed0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1eee0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1eef0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ef00 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1ef10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1ef20 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1ef30 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1ef40 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1ef50 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1ef60 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1ef70 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1ef80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1ef90 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1efa0 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1efb0 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1efc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1efd0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1efe0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1eff0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1f000 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1f010 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1f020 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1f030 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1f040 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1f050 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1f060 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1f070 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1f080 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1f090 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1f0a0 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1f0b0 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1f0c0 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1f0d0 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1f0e0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1f0f0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1f100 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1f110 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1f120 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1f130 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1f140 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1f150 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1f160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f170 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1f180 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f190 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1f1a0 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1f1b0 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1f1c0 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1f1d0 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1f1e0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1f1f0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1f200 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1f210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1f220 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1f230 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1f240 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1f250 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1f260 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f270 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1f280 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1f290 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1f2a0 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1f2b0 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1f2c0 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1f2d0 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1f2e0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1f2f0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1f300 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1f310 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1f320 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1f330 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1f340 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1f350 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1f360 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1f370 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1f380 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1f390 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1f3a0 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1f3d0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1f3e0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1f3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f400 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1f410 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1f420 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1f430 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1f440 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
1f450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f460 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1f470 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20     }..    nSize 
1f480 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1f490 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1f4a0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1f4b0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1f4c0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1f4d0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1f4e0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1f4f0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1f500 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1f510 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1f520 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1f530 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1f540 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1f550 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1f560 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1f570 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1f580 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1f590 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1f5a0 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1f5b0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1f5c0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1f5d0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1f5e0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1f5f0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1f600 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1f610 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1f620 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1f630 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1f640 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1f650 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1f660 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1f670 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1f680 20 65 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e   err && err!=EIN
1f690 56 41 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  VAL ) return SQL
1f6a0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f6b0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1f6c0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1f6d0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1f6e0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1f6f0 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
1f700 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
1f710 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
1f720 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1f730 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
1f740 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
1f750 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1f760 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
1f770 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
1f780 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
1f790 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
1f7a0 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
1f7b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f7c0 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
1f7d0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1f7e0 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
1f7f0 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
1f800 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
1f810 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
1f820 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1f830 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1f840 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
1f850 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1f860 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1f870 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1f880 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1f890 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1f8a0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1f8b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f8c0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
1f8d0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1f8e0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1f8f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f900 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1f910 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1f920 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1f930 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
1f940 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
1f950 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1f960 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
1f970 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
1f980 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
1f990 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
1f9a0 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
1f9b0 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
1f9c0 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
1f9d0 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
1f9e0 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
1f9f0 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
1fa00 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
1fa10 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
1fa20 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
1fa30 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
1fa40 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1fa50 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1fa60 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1fa70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fa80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1fa90 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1faa0 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1fab0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1fac0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1fad0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1fae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1faf0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1fb00 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1fb10 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1fb20 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1fb30 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1fb40 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1fb50 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1fb60 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1fb70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1fb80 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1fb90 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1fba0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1fbb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1fbc0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1fbd0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1fbe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fbf0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1fc00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fc10 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1fc20 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1fc30 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1fc40 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1fc50 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1fc60 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1fc70 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1fc80 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1fc90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1fca0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1fcb0 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1fcc0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1fcd0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1fce0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fcf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fd00 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1fd10 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1fd20 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1fd30 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1fd40 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1fd50 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1fd60 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1fd70 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1fd80 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1fd90 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1fda0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1fdb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1fdc0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1fdd0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1fde0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1fdf0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1fe00 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1fe10 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1fe20 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
1fe30 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
1fe40 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
1fe50 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1fe60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fe70 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1fe80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1fe90 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1fea0 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
1feb0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1fec0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
1fed0 74 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64  tch( op ){.#if d
1fee0 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
1fef0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1ff00 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
1ff10 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
1ff20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ff30 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49  CNTL_BEGIN_ATOMI
1ff40 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
1ff50 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
1ff60 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
1ff70 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49  _IOC_START_ATOMI
1ff80 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
1ff90 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
1ffa0 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41  TE_IOERR_BEGIN_A
1ffb0 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
1ffc0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ffd0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1ffe0 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
1fff0 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
20000 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
20010 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
20020 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52  COMMIT_ATOMIC_WR
20030 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
20040 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
20050 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  OERR_COMMIT_ATOM
20060 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
20070 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c  QLITE_FCNTL_ROLL
20090 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54  BACK_ATOMIC_WRIT
200a0 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
200b0 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
200c0 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41  e->h, F2FS_IOC_A
200d0 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
200e0 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
200f0 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
20100 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  OERR_ROLLBACK_AT
20110 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
20120 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20130 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
20140 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
20150 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
20160 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */..    case SQL
20170 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
20180 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
20190 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
201a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
201b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
201c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
201d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
201e0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
201f0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
20200 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
20210 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
20220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20230 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
20240 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
20250 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
20260 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
20270 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
20280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20290 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
202a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
202b0 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
202c0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
202d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
202e0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
202f0 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
20300 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
20310 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
20320 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
20330 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
20340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20350 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20360 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
20370 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
20380 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
20390 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
203a0 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
203b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
203c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
203d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
203e0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
203f0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
20400 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
20410 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
20420 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
20430 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20450 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20460 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
20470 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
20480 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
20490 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
204a0 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
204b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
204c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
204d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
204e0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
204f0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
20500 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
20510 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69  e3_malloc64( pFi
20520 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
20530 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
20540 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
20550 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
20560 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
20570 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
20580 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
20590 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
205a0 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
205b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
205c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
205d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
205e0 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
205f0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
20600 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
20610 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
20620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20630 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20640 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
20650 5f 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73  _TIMEOUT.    cas
20660 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
20670 4f 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20  OCK_TIMEOUT: {. 
20680 20 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73       pFile->iBus
20690 79 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74  yTimeout = *(int
206a0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
206b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
206c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
206d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
206e0 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
206f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
20700 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
20710 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
20720 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
20730 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
20740 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
20750 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
20760 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
20770 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
20780 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
20790 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
207a0 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a  xMmap;.      }..
207b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
207c0 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d  ue of newLimit m
207d0 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ay be eventually
207e0 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74   cast to (size_t
207f0 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20  ) and passed.   
20800 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e     ** to mmap().
20810 20 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61   Restrict its va
20820 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73  lue to 2GB if (s
20830 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74  ize_t) is not at
20840 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a   least a.      *
20850 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a  * 64-bit type. *
20860 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  /.      if( newL
20870 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66  imit>0 && sizeof
20880 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20  (size_t)<8 ){.  
20890 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
208a0 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37   (newLimit & 0x7
208b0 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20  FFFFFFF);.      
208c0 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29  }..      *(i64*)
208d0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
208e0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
208f0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
20900 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
20910 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
20920 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
20930 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
20940 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
20950 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
20960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
20970 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  ile->mmapSize>0 
20980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  ){.          uni
20990 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
209a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
209b0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
209c0 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
209d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
209e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
209f0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
20a00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20a10 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
20a20 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
20a30 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
20a40 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
20a50 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
20a60 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
20a70 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
20a80 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
20a90 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
20aa0 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
20ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
20ac0 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
20ad0 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
20ae0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
20af0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20b00 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
20b10 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
20b20 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
20b30 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
20b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20b50 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
20b60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20b70 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
20b80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
20b90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20ba0 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
20bb0 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
20bc0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47  e SQLITE_FCNTL_G
20bd0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
20be0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
20bf0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
20c00 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
20c10 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
20c20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
20c30 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
20c40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
20c50 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
20c60 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
20c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  ;.}../*.** If pF
20c80 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  d->sectorSize is
20c90 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
20ca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20cb0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a  called, it is a.
20cc0 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
20cd0 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20  ise, the values 
20ce0 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  of pFd->sectorSi
20cf0 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e  ze and .** pFd->
20d00 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20d10 73 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63  stics are set ac
20d20 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
20d30 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63  ile-system .** c
20d40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20  haracteristics. 
20d50 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
20d60 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
20d70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
20d80 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20  One for QNX and 
20d90 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f  one for all.** o
20da0 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  ther systems..*/
20db0 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
20dc0 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  O__.static void 
20dd0 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
20de0 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c  eristics(unixFil
20df0 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
20e00 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  t( pFd->deviceCh
20e10 61 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30  aracteristics==0
20e20 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53   || pFd->sectorS
20e30 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize!=0 );.  if( 
20e40 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  pFd->sectorSize=
20e50 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
20e60 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
20e70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
20e80 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
20e90 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e  IC_WRITE).    in
20ea0 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66  t res;.    u32 f
20eb0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
20ec0 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20  eck for support 
20ed0 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20  for F2FS atomic 
20ee0 62 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f  batch writes. */
20ef0 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63  .    res = osIoc
20f00 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f  tl(pFd->h, F2FS_
20f10 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53  IOC_GET_FEATURES
20f20 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72  , &f);.    if( r
20f30 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32  es==0 && (f & F2
20f40 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49  FS_FEATURE_ATOMI
20f50 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  C_WRITE) ){.    
20f60 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61    pFd->deviceCha
20f70 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53  racteristics = S
20f80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
20f90 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a  H_ATOMIC;.    }.
20fa0 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
20fb0 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  x__ && SQLITE_EN
20fc0 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
20fd0 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20  C_WRITE */..    
20fe0 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52  /* Set the POWER
20ff0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66  SAFE_OVERWRITE f
21000 6c 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64  lag if requested
21010 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64  . */.    if( pFd
21020 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
21030 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
21040 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65       pFd->device
21050 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21060 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
21070 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
21080 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ITE;.    }..    
21090 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
210a0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
210b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
210c0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75  }.}.#else.#inclu
210d0 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
210e0 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
210f0 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
21100 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
21110 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21120 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
21130 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
21140 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
21150 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
21160 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
21170 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
21180 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
21190 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
211a0 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
211b0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
211c0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
211d0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
211e0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
211f0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21200 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
21210 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
21220 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
21230 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
21240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
21250 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
21260 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
21270 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
21280 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21290 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
212a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
212b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
212c0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
212d0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
212e0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
212f0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
21300 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
21310 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
21320 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21330 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21340 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21350 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21360 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21390 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
213a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
213b0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
213c0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
213d0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
213e0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
213f0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21410 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
21420 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21430 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21440 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
21450 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
21460 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
21470 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
21480 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
21490 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
214a0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
214b0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
214c0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
214d0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
214e0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
214f0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
21500 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
21510 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
21520 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
21530 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21540 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
21550 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
21560 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
21570 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
215b0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
215c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
215d0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
215e0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
215f0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
21600 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
21640 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
21650 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
21660 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
21670 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
21680 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
21690 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
216a0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
216b0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
216c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
216d0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
216e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
216f0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
21700 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
21710 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
21720 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
21730 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
21740 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
21750 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
21760 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
21770 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
217a0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
217b0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
217c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
217d0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
217e0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
217f0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
21800 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
21830 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
21840 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
21850 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
21860 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
21870 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
21880 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
21890 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
218a0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
218b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
218c0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
218d0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
218e0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
218f0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
21900 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
21910 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
21920 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
21930 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
21940 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
21950 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
21960 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21970 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21980 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21990 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
219a0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
219e0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
219f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
21a00 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
21a10 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
21a20 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
21a30 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
21a40 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
21a50 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
21a60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21a70 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
21a80 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
21a90 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
21aa0 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
21ab0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
21ac0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
21ad0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
21ae0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
21af0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
21b00 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
21b10 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
21b20 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
21b30 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
21b40 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
21b50 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
21b80 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
21b90 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
21ba0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
21bb0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
21bc0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
21bd0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
21be0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
21bf0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
21c00 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
21c10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
21c20 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
21c30 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
21c40 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
21c50 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
21c80 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
21c90 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
21ca0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
21cb0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
21cc0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
21cd0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
21ce0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
21cf0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
21d00 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
21d10 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
21d20 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
21d30 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
21d40 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
21d50 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
21d60 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
21d70 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
21d80 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
21d90 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
21da0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21db0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
21dc0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
21dd0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
21de0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
21df0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
21e00 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
21e10 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
21e20 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
21e30 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
21e40 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
21e50 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
21e60 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
21e70 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
21e80 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
21e90 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
21ea0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
21eb0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
21ec0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
21ed0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
21ee0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
21ef0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
21f00 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
21f10 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
21f20 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
21f30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
21f40 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
21f50 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
21f60 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
21f70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
21f80 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
21f90 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20  eristics(pFd);. 
21fa0 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63   return pFd->sec
21fb0 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  torSize;.}../*.*
21fc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
21fd0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
21fe0 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
21ff0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
22000 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
22010 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
22020 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
22030 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
22040 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
22050 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
22060 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
22070 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
22080 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
22090 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
220a0 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
220b0 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
220c0 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
220d0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
220e0 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
220f0 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
22100 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
22110 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
22120 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
22130 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
22140 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
22150 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
22160 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
22170 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
22180 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
22190 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
221a0 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
221b0 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
221c0 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
221d0 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
221e0 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
221f0 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
22200 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
22210 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
22220 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
22230 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
22240 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
22250 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
22260 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
22270 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
22280 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
22290 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
222a0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
222b0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
222c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
222d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
222e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
222f0 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
22300 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
22310 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
22320 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
22330 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64  stics;.}..#if !d
22340 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22350 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
22360 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
22370 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
22380 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
22390 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
223a0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
223b0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
223c0 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
223d0 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
223e0 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
223f0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
22400 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
22410 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
22420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22430 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
22440 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
22450 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
22460 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
22470 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
22480 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
22490 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
224a0 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
224b0 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
224c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
224d0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
224e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
224f0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
22500 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
22510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22520 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
22530 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
22540 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
22550 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
22560 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
22570 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
22580 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
22590 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
225a0 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
225b0 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
225c0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
225d0 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
225e0 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
225f0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
22600 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
22610 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
22620 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
22630 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
22640 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
22650 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
22660 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22670 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
22680 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
22690 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
226a0 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
226b0 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
226c0 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
226d0 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
226e0 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
226f0 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
22700 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
22710 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
22720 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
22730 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
22740 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
22750 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
22760 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
22770 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
22780 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
22790 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
227a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
227b0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
227c0 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
227d0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
227e0 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
227f0 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
22800 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
22810 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
22820 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
22830 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
22840 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
22850 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
22860 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
22870 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
22880 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
22890 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
228a0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
228b0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
228c0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
228d0 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
228e0 68 53 68 6d 0a 2a 2a 20 20 20 20 20 20 7a 46 69  hShm.**      zFi
228f0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
22900 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
22910 70 53 68 6d 4d 75 74 65 78 20 6d 75 73 74 20 62  pShmMutex must b
22920 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
22930 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
22940 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
22950 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
22960 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
22970 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
22980 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
22990 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
229a0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
229b0 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
229c0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
229d0 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
229e0 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
229f0 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
22a00 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 53 68  lite3_mutex *pSh
22a10 6d 4d 75 74 65 78 3b 20 20 2f 2a 20 4d 75 74 65  mMutex;  /* Mute
22a20 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
22a30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
22a40 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
22a50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22a60 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66  of the mmapped f
22a70 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68  ile */.  int hSh
22a80 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
22a90 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
22aa0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
22ab0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22ad0 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
22ae0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
22af0 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20    u16 nRegion;  
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b10 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
22b20 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
22b30 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
22b40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22b50 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
22b60 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20   u8 isUnlocked; 
22b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22b80 72 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f  rue if no DMS lo
22b90 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61  ck held */.  cha
22ba0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
22bb0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
22bc0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
22bd0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
22be0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
22c10 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
22c20 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
22c30 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
22c40 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
22c50 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
22c60 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
22c70 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
22c80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
22c90 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
22ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
22cb0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
22cc0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
22cd0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
22ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
22cf0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
22d00 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
22d10 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
22d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
22d30 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
22d40 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
22d50 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
22d60 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
22d70 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
22d80 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
22d90 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
22da0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
22db0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
22dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
22dd0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
22de0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
22df0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
22e00 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
22e10 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
22e20 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
22e30 20 20 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f    unixShm.pShmNo
22e40 64 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  de.**    unixShm
22e50 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
22e60 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
22e70 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
22e80 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f 64 65  unixShm.pShmNode
22e90 2d 3e 70 53 68 6d 4d 75 74 65 78 20 6d 75 73 74  ->pShmMutex must
22ea0 0a 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c  .** be held whil
22eb0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
22ec0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
22ed0 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
22ee0 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
22ef0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22f00 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22f10 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
22f20 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
22f30 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
22f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
22f50 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
22f60 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
22f70 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
22f80 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
22f90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
22fa0 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
22fb0 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
22fc0 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
22ff0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
23000 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
23010 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
23020 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
23030 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
23040 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
23050 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23070 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
23080 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
23090 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
230a0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
230b0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
230c0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
230d0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
230e0 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
230f0 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
23100 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
23110 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
23120 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
23130 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
23140 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
23150 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
23160 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
23170 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
23180 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
23190 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
231a0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
231b0 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
231c0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
231d0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
231e0 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
231f0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
23200 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
23210 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
23220 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
23230 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
23240 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
23250 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
23260 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
23270 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
23280 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
23290 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
232a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
232b0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
232c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
232d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
232f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
23300 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
23310 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
23320 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
23330 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
23340 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
23350 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
23360 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
23370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
23380 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
23390 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
233a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
233b0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
233c0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
233d0 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
233e0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
233f0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
23400 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
23410 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
23420 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
23430 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
23440 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
23450 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
23460 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
23470 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
23480 2d 3e 70 53 68 6d 4d 75 74 65 78 29 20 29 3b 0a  ->pShmMutex) );.
23490 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
234a0 64 65 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 75 6e  de->nRef>0 || un
234b0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
234c0 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
234d0 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
234e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
234f0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
23500 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
23510 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
23520 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
23530 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
23540 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
23550 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
23560 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
23570 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  Node->hShm>=0 ){
23580 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
23590 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
235a0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
235b0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
235c0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
235d0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
235e0 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
235f0 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
23600 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72 63 20 3d  en = n;.    rc =
23610 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
23620 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  oryLock(pShmNode
23630 2d 3e 68 53 68 6d 2c 20 26 66 2c 20 70 46 69 6c  ->hShm, &f, pFil
23640 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  e);.    rc = (rc
23650 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
23660 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
23670 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
23680 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
23690 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
236a0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
236b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
236c0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
236d0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
236e0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
236f0 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
23700 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f   0xffff : (1<<(o
23710 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
23720 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
23730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23740 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
23750 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
23760 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
23770 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
23780 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23790 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
237a0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
237b0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
237c0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
237d0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
237e0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
237f0 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
23800 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
23810 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
23820 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
23830 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
23840 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23850 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
23860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23870 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
23880 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
23890 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
238a0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
238b0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
238c0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
238d0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
238e0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
238f0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23900 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
23910 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
23920 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
23930 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
23940 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
23950 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
23960 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
23970 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
23980 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
23990 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
239a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
239b0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
239c0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
239d0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
239e0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
239f0 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
23a00 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
23a10 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
23a20 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
23a30 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23a40 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
23a50 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
23a60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23a70 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
23a80 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
23a90 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  n the minimum nu
23aa0 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d  mber of 32KB shm
23ab0 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68   regions that sh
23ac0 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61  ould be mapped a
23ad0 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73  t.** a time, ass
23ae0 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20  uming that each 
23af0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
23b00 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
23b10 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ple of the.** cu
23b20 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67  rrent system pag
23b30 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73  e-size..**.** Us
23b40 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31  ually, this is 1
23b50 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
23b60 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74  seems to be syst
23b70 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  ems that are con
23b80 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73  figured.** to us
23b90 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69  e 64KB pages - i
23ba0 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68  n this case each
23bb0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f   mapping must co
23bc0 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f  ver at least two
23bd0 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e  .** shm regions.
23be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23bf0 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
23c00 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ap(void){.  int 
23c10 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b  shmsz = 32*1024;
23c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23c30 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a  HM region size *
23c40 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f  /.  int pgsz = o
23c50 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20  sGetpagesize(); 
23c60 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65    /* System page
23c70 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72   size */.  asser
23c80 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73  t( ((pgsz-1)&pgs
23c90 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61  z)==0 );   /* Pa
23ca0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
23cb0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a  a power of 2 */.
23cc0 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a    if( pgsz<shmsz
23cd0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
23ce0 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a  eturn pgsz/shmsz
23cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  ;.}../*.** Purge
23d00 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
23d10 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
23d20 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
23d30 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
23d40 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
23d50 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
23d60 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
23d70 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
23d80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
23d90 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
23da0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
23db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23dc0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
23dd0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
23de0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
23df0 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
23e00 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
23e10 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
23e20 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
23e30 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d  ALWAYS(p->nRef==
23e40 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  0) ){.    int nS
23e50 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
23e60 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
23e70 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23e80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
23e90 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
23ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
23eb0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 70 53 68  utex_free(p->pSh
23ec0 6d 4d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  mMutex);.    for
23ed0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
23ee0 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
23ef0 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
23f00 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20  >hShm>=0 ){.    
23f10 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
23f20 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
23f30 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
23f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23f50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23f60 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
23f70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23f80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23f90 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
23fa0 66 28 20 70 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  f( p->hShm>=0 ){
23fb0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
23fc0 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 53 68 6d  ose(pFd, p->hShm
23fd0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
23fe0 20 20 20 70 2d 3e 68 53 68 6d 20 3d 20 2d 31 3b     p->hShm = -1;
23ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
24000 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
24010 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
24020 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
24030 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
24040 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
24050 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
24060 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
24070 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
24080 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
24090 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
240a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
240b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
240c0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
240d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
240e0 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
240f0 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
24100 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
24110 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  m=1 .** connecti
24120 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
24130 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
24140 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
24150 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
24160 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
24170 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
24180 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
24190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
241a0 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
241b0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
241c0 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f 64 65  bFd, unixShmNode
241d0 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 73   *pShmNode){.  s
241e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
241f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24200 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73  ITE_OK;..  /* Us
24210 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64 65 74  e F_GETLK to det
24220 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
24230 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
24240 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 2a   are holding.  *
24250 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  * on the DMS byt
24260 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
24270 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
24280 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
24290 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  ng.  ** a SHARED
242a0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
242b0 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
242c0 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 20  o take a SHARED 
242d0 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 70 72  lock.  ** and pr
242e0 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
242f0 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
24300 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  e. .  **.  ** Or
24310 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72  , if no other pr
24320 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
24330 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
24340 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a  this process.  *
24350 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  * is the first t
24360 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68  o open it. In th
24370 69 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20  is case take an 
24380 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
24390 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62  n the.  ** DMS b
243a0 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65  yte and truncate
243b0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
243c0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
243d0 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a   size. Then.  **
243e0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
243f0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
24400 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a  he DMS byte..  *
24410 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65  *.  ** If anothe
24420 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
24430 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
24440 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d  E lock on the DM
24450 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74  S byte,.  ** ret
24460 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
24470 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69  to the caller (i
24480 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  t will try again
24490 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20  ). An earlier.  
244a0 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
244b0 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65  is code attempte
244c0 64 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  d the SHARED loc
244d0 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  k at this point.
244e0 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69   But.  ** this i
244f0 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74  ntroduced a subt
24500 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  le race conditio
24510 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  n: if the proces
24520 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45  s holding.  ** E
24530 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20  XCLUSIVE failed 
24540 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e  just before trun
24550 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  cating the *-shm
24560 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73   file, then this
24570 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69  .  ** process mi
24580 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65  ght open and use
24590 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
245a0 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69  without truncati
245b0 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20  ng it..  ** And 
245c0 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  if the *-shm fil
245d0 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
245e0 70 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20  pted by a power 
245f0 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20  failure or.  ** 
24600 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68  system crash, th
24610 65 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c  e database itsel
24620 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d  f may also becom
24630 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  e corrupt.  */. 
24640 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
24650 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24660 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e 49 58  k.l_start = UNIX
24670 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b  _SHM_DMS;.  lock
24680 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
24690 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
246a0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
246b0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  tl(pShmNode->hSh
246c0 6d 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  m, F_GETLK, &loc
246d0 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72 63  k)!=0 ) {.    rc
246e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
246f0 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LOCK;.  }else if
24700 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
24710 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66  _UNLCK ){.    if
24720 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
24730 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adonly ){.      
24740 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
24750 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  cked = 1;.      
24760 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
24770 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20  ONLY_CANTINIT;. 
24780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24790 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
247a0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
247b0 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
247c0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  DMS, 1);.      /
247d0 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6e 6e  * The first conn
247e0 65 63 74 69 6f 6e 20 74 6f 20 61 74 74 61 63 68  ection to attach
247f0 20 6d 75 73 74 20 74 72 75 6e 63 61 74 65 20 74   must truncate t
24800 68 65 20 2d 73 68 6d 20 66 69 6c 65 2e 20 20 57  he -shm file.  W
24810 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63  e.      ** trunc
24820 61 74 65 20 74 6f 20 33 20 62 79 74 65 73 20 28  ate to 3 bytes (
24830 61 6e 20 61 72 62 69 74 72 61 72 79 20 73 6d 61  an arbitrary sma
24840 6c 6c 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ll number, less 
24850 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
24860 2a 20 2d 73 68 6d 20 68 65 61 64 65 72 20 73 69  * -shm header si
24870 7a 65 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  ze) rather than 
24880 30 20 61 73 20 61 20 73 79 73 74 65 6d 20 64 65  0 as a system de
24890 62 75 67 67 69 6e 67 20 61 69 64 2c 20 74 6f 0a  bugging aid, to.
248a0 20 20 20 20 20 20 2a 2a 20 68 65 6c 70 20 64 65        ** help de
248b0 74 65 63 74 20 69 66 20 61 20 2d 73 68 6d 20 66  tect if a -shm f
248c0 69 6c 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 69  ile truncation i
248d0 73 20 6c 65 67 69 74 69 6d 61 74 65 20 6f 72 20  s legitimate or 
248e0 69 73 20 74 68 65 20 77 6f 72 6b 0a 20 20 20 20  is the work.    
248f0 20 20 2a 2a 20 6f 72 20 61 20 72 6f 67 75 65 20    ** or a rogue 
24900 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20  process. */.    
24910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24920 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74  _OK && robust_ft
24930 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
24940 2d 3e 68 53 68 6d 2c 20 33 29 20 29 7b 0a 20 20  ->hShm, 3) ){.  
24950 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24960 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24970 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74  OERR_SHMOPEN,"ft
24980 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
24990 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
249a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
249b0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
249c0 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
249d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
249e0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BUSY;.  }..  if
249f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
24a10 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
24a20 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79  LCK || lock.l_ty
24a30 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20  pe==F_RDLCK );. 
24a40 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
24a50 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
24a60 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
24a70 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a  HM_DMS, 1);.  }.
24a80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24a90 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
24aa0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
24ab0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24ac0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
24ad0 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
24ae0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
24af0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
24b00 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
24b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
24b20 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
24b30 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
24b40 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
24b50 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
24b60 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24b70 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
24b80 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
24b90 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24ba0 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
24bb0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
24bc0 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
24bd0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
24be0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
24bf0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
24c00 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
24c10 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
24c20 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
24c30 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
24c40 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
24c50 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
24c60 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
24c70 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
24c80 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
24c90 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
24ca0 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
24cb0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
24cc0 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
24cd0 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
24ce0 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
24cf0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
24d00 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
24d10 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
24d20 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
24d30 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
24d40 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
24d50 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
24d60 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
24d70 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
24d80 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
24d90 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
24da0 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
24db0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
24dc0 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
24dd0 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
24de0 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
24df0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
24e00 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
24e10 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
24e20 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
24e30 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
24e40 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
24e50 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
24e60 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
24e70 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
24e80 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
24e90 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
24ea0 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
24eb0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
24ec0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
24ed0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
24ee0 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
24ef0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
24f00 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
24f10 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
24f20 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
24f30 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
24f40 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24f50 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
24f60 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
24f70 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
24f80 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
24f90 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
24fa0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
24fb0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
24fc0 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
24fd0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
24fe0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
24ff0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
25000 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
25010 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
25020 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
25030 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
25040 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
25050 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
25060 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
25070 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
25080 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
25090 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
250a0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
250b0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
250c0 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
250d0 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
250e0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
250f0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
25100 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
25110 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
25120 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
25130 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
25140 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
25150 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
25160 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
25170 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
25180 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
25190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
251a0 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
251b0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
251c0 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
251d0 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
251e0 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
251f0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
25200 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
25210 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
25220 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
25230 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
25240 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
25250 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
25260 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
25270 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
25280 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
25290 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
252a0 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
252b0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
252c0 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
252d0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
252e0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
252f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
25300 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25310 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
25320 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
25330 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ile */.  int rc 
25340 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25350 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25360 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
25370 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
25380 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
25390 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
253a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 3b  */.  char *zShm;
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
253d0 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
253e0 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
253f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
25400 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
25410 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
25420 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
25430 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
25440 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
25450 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
25460 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
25470 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
25480 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
25490 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
254a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
254b0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
254c0 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
254d0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
254e0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
254f0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
25500 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
25510 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
25520 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
25530 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
25540 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
25550 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
25560 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ary..  */.  asse
25570 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  rt( unixFileMute
25580 78 4e 6f 74 68 65 6c 64 28 70 44 62 46 64 29 20  xNotheld(pDbFd) 
25590 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
255a0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
255b0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
255c0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
255d0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
255e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
255f0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
25600 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
25610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
25620 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
25630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25650 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
25660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
25670 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d  asePath = pDbFd-
25680 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a  >zPath;.#endif..
25690 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
256a0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
256b0 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
256c0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
256d0 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
256e0 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
256f0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
25700 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
25710 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
25720 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
25730 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
25740 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
25750 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
25760 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  Fd->h, &sStat) )
25770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25780 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
25790 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
257a0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
257b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
257c0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
257d0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
257e0 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
257f0 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
25800 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
25810 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
25820 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73  (int)strlen(zBas
25830 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ePath);.#endif. 
25840 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
25850 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
25860 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
25870 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
25880 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
25890 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
258a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
258b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
258c0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
258d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
258e0 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20  et(pShmNode, 0, 
258f0 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
25900 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  )+nShmFilename);
25910 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70 53 68 6d  .    zShm = pShm
25920 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
25930 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
25940 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
25950 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25960 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
25970 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
25980 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a 20 20 20  name, zShm, .   
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
259b0 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
259c0 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
259f0 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
25a00 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
25a10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25a20 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
25a30 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68 6d 22 2c   zShm, "%s-shm",
25a40 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
25a50 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
25a60 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
25a70 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64 69 66 0a  , zShm);.#endif.
25a80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53      pShmNode->hS
25a90 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  hm = -1;.    pDb
25aa0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
25ab0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
25ac0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
25ad0 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
25ae0 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73  Inode;.    if( s
25af0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
25b00 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
25b10 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
25b20 3e 70 53 68 6d 4d 75 74 65 78 20 3d 20 73 71 6c  >pShmMutex = sql
25b30 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
25b40 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
25b50 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
25b60 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
25b70 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
25b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25b90 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
25ba0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25bb0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25bc0 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  }..    if( pInod
25bd0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25be0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
25bf0 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  0==sqlite3_uri_b
25c00 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
25c10 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
25c20 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
25c30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68     pShmNode->hSh
25c40 6d 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  m = robust_open(
25c50 7a 53 68 6d 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  zShm, O_RDWR|O_C
25c60 52 45 41 54 2c 28 73 53 74 61 74 2e 73 74 5f 6d  REAT,(sStat.st_m
25c70 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
25c80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53    }.      if( pS
25c90 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 29  hmNode->hShm<0 )
25ca0 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
25cb0 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f 62 75 73  de->hShm = robus
25cc0 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
25cd0 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e 73 74  DONLY, (sStat.st
25ce0 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
25cf0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
25d00 64 65 2d 3e 68 53 68 6d 3c 30 20 29 7b 0a 20 20  de->hShm<0 ){.  
25d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
25d20 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
25d30 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
25d40 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20  "open", zShm);. 
25d50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25d60 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
25d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53      }.        pS
25d80 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
25d90 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
25da0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
25db0 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
25dc0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61  ning as root, ma
25dd0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
25de0 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20   SHM file.      
25df0 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  ** is owned by t
25e00 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61  he same user tha
25e10 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69  t owns the origi
25e20 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f  nal database.  O
25e30 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
25e40 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
25e50 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62  owner will not b
25e60 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  e able to connec
25e70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
25e80 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70    robustFchown(p
25e90 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 73  ShmNode->hShm, s
25ea0 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
25eb0 61 74 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20  at.st_gid);..   
25ec0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b     rc = unixLock
25ed0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
25ee0 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20  Fd, pShmNode);. 
25ef0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25f00 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
25f10 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
25f20 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68  NTINIT ) goto sh
25f30 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
25f40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
25f50 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
25f60 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
25f70 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
25f80 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
25f90 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
25fa0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25fb0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
25fc0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
25fd0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
25fe0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
25ff0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
26000 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
26010 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
26020 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
26030 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
26040 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
26050 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
26060 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
26070 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
26080 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
26090 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
260a0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
260b0 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
260c0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
260d0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
260e0 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
260f0 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
26100 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
26110 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
26120 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
26130 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
26140 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
26150 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
26160 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
26170 68 65 0a 20 20 2a 2a 20 70 53 68 6d 4e 6f 64 65  he.  ** pShmNode
26180 2d 3e 70 53 68 6d 4d 75 74 65 78 2e 0a 20 20 2a  ->pShmMutex..  *
26190 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
261a0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
261b0 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20  ->pShmMutex);.  
261c0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
261d0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
261e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
261f0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
26200 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26210 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  ode->pShmMutex);
26220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
26230 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
26240 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
26250 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
26260 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
26270 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
26280 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
26290 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
262a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
262b0 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
262c0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
262d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
262e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
262f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
26300 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
26310 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
26320 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
26330 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
26340 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
26350 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
26360 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
26370 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
26380 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
26390 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
263a0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
263b0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
263c0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
263d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
263e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
263f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26400 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
26410 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
26420 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
26430 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
26440 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
26450 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
26460 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
26470 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
26480 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
26490 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
264a0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
264b0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
264c0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
264d0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
264e0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
264f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
26500 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
26510 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
26520 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
26530 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
26540 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
26550 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
26560 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
26570 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
26580 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
26590 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
265a0 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
265b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
265c0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
265d0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
265e0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
265f0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
26600 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
26610 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
26620 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
26630 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
26640 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
26650 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
26660 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
26670 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26680 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
26690 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
266a0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
266b0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
266c0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
266d0 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
266e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
266f0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
26700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
26710 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
26720 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
26730 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26740 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26750 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
26760 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26780 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
26790 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
267a0 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
267b0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
267c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
267d0 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
267e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
267f0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
26800 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
26810 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
26820 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
26830 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26840 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
26850 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
26860 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
26870 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
26880 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
26890 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
268a0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
268b0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
268c0 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
268d0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
268e0 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
268f0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
26900 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
26910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26920 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
26930 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
26940 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
26950 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
26960 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26970 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  pShmNode->pShmMu
26980 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d  tex);.  if( pShm
26990 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
269a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
269b0 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  xLockSharedMemor
269c0 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64  y(pDbFd, pShmNod
269d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
269e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
269f0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
26a00 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
26a10 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  locked = 0;.  }.
26a20 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
26a30 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
26a40 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
26a50 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
26a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26a70 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
26a80 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
26a90 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
26aa0 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20 70 44  e->hShm>=0 || pD
26ab0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26ac0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
26ad0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26ae0 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20 70 44  de->hShm<0 || pD
26af0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26b00 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
26b10 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75  .  /* Minimum nu
26b20 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20  mber of regions 
26b30 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d  required to be m
26b40 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71  apped. */.  nReq
26b50 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69  Region = ((iRegi
26b60 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f  on+nShmPerMap) /
26b70 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e   nShmPerMap) * n
26b80 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66  ShmPerMap;..  if
26b90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
26ba0 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
26bb0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
26bc0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
26bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
26be0 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
26bf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
26c00 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  e = nReqRegion*s
26c10 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69  zRegion;   /* Mi
26c20 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
26c30 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
26c40 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
26c50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
26c60 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
26c70 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
26c80 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
26c90 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
26ca0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
26cb0 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  hShm>=0 ){.     
26cc0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
26cd0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
26ce0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
26cf0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
26d00 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
26d10 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
26d20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
26d30 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
26d40 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
26d50 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
26d60 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
26d70 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
26d80 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
26d90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26da0 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
26db0 6f 64 65 2d 3e 68 53 68 6d 2c 20 26 73 53 74 61  ode->hShm, &sSta
26dc0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
26dd0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26de0 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
26df0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26e00 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
26e10 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
26e20 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
26e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
26e40 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
26e50 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
26e60 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
26e70 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
26e80 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
26e90 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
26ea0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
26eb0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26ec0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
26ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26ee0 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
26ef0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26f00 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
26f10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
26f20 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
26f30 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
26f40 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
26f50 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
26f60 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
26f70 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
26f80 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
26f90 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
26fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
26fb0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
26fc0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
26fd0 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
26fe0 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
26ff0 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
27000 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
27010 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
27020 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
27030 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
27040 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
27050 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
27060 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
27070 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
27080 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
27090 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
270a0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
270b0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
270c0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
270d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
270e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
270f0 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
27100 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
27110 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
27120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27130 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
27140 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
27150 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
27160 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
27170 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27180 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
27190 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
271a0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
271b0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
271c0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
271d0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
271e0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
271f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27200 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
27210 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 69  ShmNode->hShm, i
27220 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31  Pg*pgsz + pgsz-1
27230 2c 22 22 2c 31 2c 26 78 29 21 3d 31 20 29 7b 0a  ,"",1,&x)!=1 ){.
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27250 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
27260 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
27270 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
27280 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
27290 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
272a0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
272b0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
272c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
272d0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
272e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
272f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27300 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27310 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
27320 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
27330 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
27340 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
27350 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
27360 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
27370 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
27380 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
27390 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
273a0 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
273b0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
273c0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
273d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
273e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
273f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
27400 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
27410 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
27420 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
27430 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
27440 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
27450 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
27460 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
27470 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
27480 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
27490 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
274a0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
274b0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30  ShmNode->hShm>=0
274c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
274d0 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61   = osMmap(0, nMa
274e0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p,.            p
274f0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
27500 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20  nly ? PROT_READ 
27510 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54  : PROT_READ|PROT
27520 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20  _WRITE, .       
27530 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
27540 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c   pShmNode->hShm,
27550 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
27560 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
27570 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27580 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
27590 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
275a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
275b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
275c0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
275d0 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
275e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
275f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27600 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
27610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27620 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
27630 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 4d  ite3_malloc64(nM
27640 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
27650 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
27660 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27670 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27680 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27690 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
276a0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
276b0 65 74 28 70 4d 65 6d 2c 20 30 2c 20 6e 4d 61 70  et(pMem, 0, nMap
276c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
276d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68    for(i=0; i<nSh
276e0 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20  mPerMap; i++){. 
276f0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
27700 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
27710 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d  de->nRegion+i] =
27720 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b   &((char*)pMem)[
27730 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20  szRegion*i];.   
27740 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
27750 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20  ode->nRegion += 
27760 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
27770 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
27780 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
27790 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
277a0 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
277b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
277c0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
277d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
277e0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   0;.  }.  if( pS
277f0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
27800 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ly && rc==SQLITE
27810 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
27820 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71  E_READONLY;.  sq
27830 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
27840 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  e(pShmNode->pShm
27850 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
27860 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
27870 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
27880 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
27890 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
278a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
278b0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
278c0 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
278d0 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
278e0 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
278f0 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
27900 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
27910 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
27920 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
27930 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
27940 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
27950 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
27960 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
27970 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
27980 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
27990 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
279a0 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
279b0 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
279c0 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
279d0 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
279e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
279f0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
27a00 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
27a10 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
27a20 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
27a30 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
27a40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27a50 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
27a60 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
27a70 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a90 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
27aa0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
27ab0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
27ac0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
27ad0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
27ae0 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
27af0 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
27b00 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
27b10 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
27b20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
27b30 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
27b40 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
27b50 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
27b60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
27b70 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
27b80 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
27b90 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
27ba0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27bc0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
27bd0 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
27be0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
27bf0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
27c00 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
27c10 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
27c20 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
27c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
27c60 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
27c90 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
27ca0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
27cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
27cc0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
27cd0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
27ce0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
27cf0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
27d00 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
27d10 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
27d20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
27d30 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
27d40 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
27d50 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
27d60 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
27d70 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
27d80 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
27d90 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
27da0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
27db0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
27dc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
27dd0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
27de0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
27df0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
27e00 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
27e10 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
27e20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
27e30 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
27e40 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
27e50 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
27e60 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
27e70 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
27e80 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20  ode->hShm>=0 || 
27e90 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
27ea0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
27eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
27ec0 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20  Node->hShm<0 || 
27ed0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
27ee0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
27ef0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
27f00 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
27f10 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
27f20 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
27f30 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
27f40 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
27f50 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
27f60 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
27f70 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
27f80 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
27f90 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
27fa0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
27fb0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
27fc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
27fd0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
27fe0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
27ff0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
28000 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
28010 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
28020 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
28030 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
28040 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
28050 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
28060 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
28070 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
28080 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
28090 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
280a0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
280b0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
280c0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
280d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
280e0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
280f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
28100 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
28110 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pDbFd, F_UNLCK, 
28120 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
28130 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
28140 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
28150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
28160 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
28170 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
28180 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
281a0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
281b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
281c0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
281d0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
281e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
281f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
28200 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
28210 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
28220 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
28230 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
28240 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
28250 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
28260 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
28270 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
28280 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
28290 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
282a0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
282b0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
282c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
282d0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
282e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
282f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
28300 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
28310 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
28320 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
28330 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
28340 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
28350 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
28360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
28370 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
28380 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
28390 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
283a0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
283b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
283c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
283d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
283e0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
283f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28410 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
28420 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
28430 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
28440 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
28450 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  bFd, F_RDLCK, of
28460 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
28470 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
28480 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
28490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
284a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
284b0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
284c0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
284d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
284e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
284f0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
28500 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
28510 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
28520 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
28530 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
28540 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
28550 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
28560 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
28570 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
28580 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
28590 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
285a0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
285b0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
285c0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
285d0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
285e0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
285f0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
28600 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
28610 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28620 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
28630 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28640 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
28650 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
28660 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
28670 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
28680 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
28690 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
286a0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
286b0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
286c0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
286d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
286e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
286f0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
28700 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
28710 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
28720 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
28730 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28750 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
28760 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
28770 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
28780 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
28790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
287a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
287b0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
287c0 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a  de->pShmMutex);.
287d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
287e0 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
287f0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
28800 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
28810 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70     p->id, osGetp
28820 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64  id(0), p->shared
28830 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
28840 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
28850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
28860 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
28870 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
28880 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
28890 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
288a0 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
288b0 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
288c0 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
288d0 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
288e0 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
288f0 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
28900 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
28910 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28920 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
28930 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
28940 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
28950 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
28960 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
28970 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
28980 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28990 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c  METER(fd);.  sql
289a0 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65  ite3MemoryBarrie
289b0 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  r();         /* 
289c0 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
289d0 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
289e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 64 2d  */.  assert( fd-
289f0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
28a00 3d 3d 6e 6f 6c 6f 63 6b 4c 6f 63 6b 20 0a 20 20  ==nolockLock .  
28a10 20 20 20 20 20 7c 7c 20 75 6e 69 78 46 69 6c 65       || unixFile
28a20 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 28 75 6e  MutexNotheld((un
28a30 69 78 46 69 6c 65 2a 29 66 64 29 20 0a 20 20 29  ixFile*)fd) .  )
28a40 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
28a50 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ex();           
28a60 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65      /* Also mute
28a70 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63  x, for redundanc
28a80 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65  y */.  unixLeave
28a90 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
28aa0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
28ab0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
28ac0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
28ad0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
28ae0 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
28af0 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
28b00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
28b10 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
28b20 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
28b30 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
28b40 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
28b50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
28b60 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
28b70 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
28b80 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
28b90 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
28ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28bb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
28bc0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
28bd0 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
28c00 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
28c10 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
28c20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
28c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
28c40 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
28c50 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
28c60 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28c70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
28c80 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
28c90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
28ca0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
28cb0 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
28cc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
28cd0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
28ce0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
28cf0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
28d00 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
28d10 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
28d20 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
28d30 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
28d40 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
28d50 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
28d60 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
28d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28d80 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
28d90 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
28da0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
28db0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
28dc0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
28dd0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
28de0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
28df0 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
28e00 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
28e10 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
28e20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
28e30 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
28e40 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
28e50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28e60 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
28e70 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 66 6f  pShmMutex);.  fo
28e80 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
28e90 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
28ea0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
28eb0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
28ec0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
28ed0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
28ee0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
28ef0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
28f00 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
28f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
28f20 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  eave(pShmNode->p
28f30 53 68 6d 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ShmMutex);..  /*
28f40 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
28f50 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
28f60 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
28f70 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
28f80 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
28f90 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 61 73  ile, too */.  as
28fa0 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75  sert( unixFileMu
28fb0 74 65 78 4e 6f 74 68 65 6c 64 28 70 44 62 46 64  texNotheld(pDbFd
28fc0 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ) );.  unixEnter
28fd0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
28fe0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
28ff0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
29000 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
29010 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
29020 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
29030 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
29040 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  Node->hShm>=0 ){
29050 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
29060 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
29070 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
29080 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
29090 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
290a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
290b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
290c0 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
290d0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
290e0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
290f0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
29100 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
29110 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
29120 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
29130 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
29140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29150 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51  T_WAL */..#if SQ
29160 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
29170 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74  ZE>0./*.** If it
29180 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65   is currently me
29190 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d  mory mapped, unm
291a0 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a  ap file pFd..*/.
291b0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
291c0 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
291d0 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65  le *pFd){.  asse
291e0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
291f0 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
29200 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  Fd->pMapRegion )
29210 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70  {.    osMunmap(p
29220 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  Fd->pMapRegion, 
29230 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
29240 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70  ual);.    pFd->p
29250 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
29260 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
29270 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
29280 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
29290 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
292a0 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
292b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
292c0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
292d0 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65  intained by file
292e0 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20   .** descriptor 
292f0 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65  pFd to nNew byte
29300 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  s. Any existing 
29310 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61  mapping is disca
29320 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  rded..**.** If s
29330 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
29340 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
29350 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
29360 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ables:.**.**    
29370 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70     unixFile.pMap
29380 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  Region.**       
29390 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
293a0 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  e.**       unixF
293b0 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75  ile.mmapSizeActu
293c0 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75  al.**.** If unsu
293d0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72  ccessful, an err
293e0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f  or message is lo
293f0 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  gged via sqlite3
29400 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68  _log() and.** th
29410 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65  e three variable
29420 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f  s above are zero
29430 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
29440 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a   SQLite should.*
29450 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73  * continue acces
29460 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
29470 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61  e using the xRea
29480 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29  d() and xWrite()
29490 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  .** methods..*/.
294a0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
294b0 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69  Remapfile(.  uni
294c0 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20  xFile *pFd,     
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294e0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
294f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
29500 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20  nNew            
29510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29520 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20  equired mapping 
29530 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  size */.){.  con
29540 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
29550 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20  "mmap";.  int h 
29560 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20  = pFd->h;       
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29580 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
29590 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c  r open on db fil
295a0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67  e */.  u8 *pOrig
295b0 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   = (u8 *)pFd->pM
295c0 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50  apRegion;   /* P
295d0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
295e0 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a  t file mapping *
295f0 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20  /.  i64 nOrig = 
29600 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
29610 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  ual;     /* Size
29620 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e   of pOrig region
29630 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
29640 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  8 *pNew = 0;    
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
29670 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a  of new mapping *
29680 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  /.  int flags = 
29690 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20  PROT_READ;      
296a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
296b0 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61  s to pass to mma
296c0 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  p() */..  assert
296d0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
296e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
296f0 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53   nNew>pFd->mmapS
29700 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
29710 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70   nNew<=pFd->mmap
29720 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73  SizeMax );.  ass
29730 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
29740 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d   assert( pFd->mm
29750 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46  apSizeActual>=pF
29760 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
29770 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49   assert( MAP_FAI
29780 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  LED!=0 );..#ifde
29790 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  f SQLITE_MMAP_RE
297a0 41 44 57 52 49 54 45 0a 20 20 69 66 28 20 28 70  ADWRITE.  if( (p
297b0 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
297c0 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
297d0 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50  ==0 ) flags |= P
297e0 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69  ROT_WRITE;.#endi
297f0 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  f..  if( pOrig )
29800 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
29810 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  P.    i64 nReuse
29820 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
29830 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73  ;.#else.    cons
29840 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20  t int szSyspage 
29850 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
29860 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
29870 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
29880 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
29890 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
298a0 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
298b0 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
298c0 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
298d0 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
298e0 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
298f0 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
29900 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
29910 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
29920 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
29930 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
29940 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
29950 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
29960 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
29970 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
29980 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
29990 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
299a0 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
299b0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
299c0 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
299d0 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
299e0 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
299f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
29a00 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
29a10 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
29a20 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
29a30 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
29a40 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
29a50 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
29a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29a70 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
29a80 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
29a90 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
29aa0 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
29ab0 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
29ac0 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
29ad0 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20  d. Free it. */. 
29ae0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
29af0 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d  _FAILED || pNew=
29b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  =0 ){.      osMu
29b10 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  nmap(pOrig, nReu
29b20 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
29b30 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20    /* If pNew is 
29b40 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20  still NULL, try 
29b50 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74  to create an ent
29b60 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e  irely new mappin
29b70 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  g. */.  if( pNew
29b80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
29b90 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77  = osMmap(0, nNew
29ba0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
29bb0 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a  RED, h, 0);.  }.
29bc0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50  .  if( pNew==MAP
29bd0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70  _FAILED ){.    p
29be0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65  New = 0;.    nNe
29bf0 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c  w = 0;.    unixL
29c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
29c10 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50  K, zErr, pFd->zP
29c20 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ath);..    /* If
29c30 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76   the mmap() abov
29c40 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65  e failed, assume
29c50 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
29c60 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c  uent mmap() call
29c70 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72  s.    ** will pr
29c80 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e  obably fail too.
29c90 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   Fall back to us
29ca0 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
29cb0 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20   exclusively.   
29cc0 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
29cd0 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d  .  */.    pFd->m
29ce0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a  mapSizeMax = 0;.
29cf0 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52    }.  pFd->pMapR
29d00 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29  egion = (void *)
29d10 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61  pNew;.  pFd->mma
29d20 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  pSize = pFd->mma
29d30 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e  pSizeActual = nN
29d40 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  ew;.}../*.** Mem
29d50 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70  ory map or remap
29d60 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
29d70 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70   by file-descrip
29d80 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20  tor pFd (if the 
29d90 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  file.** is alrea
29da0 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65  dy mapped, the e
29db0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
29dc0 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
29dd0 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20  he new). Or, if 
29de0 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
29df0 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
29e00 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
29e10 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
29e20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61  still .** outsta
29e30 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72  nding xFetch() r
29e40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c  eferences to it,
29e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29e60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
29e70 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42   If parameter nB
29e80 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  yte is non-negat
29e90 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ive, then it is 
29ea0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
29eb0 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61  ze of .** the ma
29ec0 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
29ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
29ee0 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
29ef0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
29f00 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73   .** requested s
29f10 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
29f20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
29f30 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
29f40 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
29f50 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
29f60 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
29f70 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
29f80 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
29f90 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51  red .** using SQ
29fa0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
29fb0 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72  LIMIT, whichever
29fc0 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
29fd0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
29fe0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
29ff0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
2a000 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
2a010 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
2a020 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
2a030 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
2a040 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
2a050 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
2a060 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
2a070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a080 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
2a090 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
2a0a0 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Map){.  assert( 
2a0b0 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
2a0c0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
2a0d0 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30    assert( nMap>0
2a0e0 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69   || (pFd->mmapSi
2a0f0 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d  ze==0 && pFd->pM
2a100 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a  apRegion==0) );.
2a110 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
2a120 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
2a130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
2a140 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
2a150 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
2a160 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  buf;          /*
2a170 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
2a180 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
2a190 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
2a1a0 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29  Fd->h, &statbuf)
2a1b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a1c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
2a1d0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  TAT;.    }.    n
2a1e0 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74  Map = statbuf.st
2a1f0 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  _size;.  }.  if(
2a200 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
2a210 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
2a220 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
2a230 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73  zeMax;.  }..  as
2a240 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20  sert( nMap>0 || 
2a250 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d  (pFd->mmapSize==
2a260 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65  0 && pFd->pMapRe
2a270 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  gion==0) );.  if
2a280 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
2a290 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69  pSize ){.    uni
2a2a0 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20  xRemapfile(pFd, 
2a2b0 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nMap);.  }..  re
2a2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a2d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2a2e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2a2f0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
2a300 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
2a310 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2a320 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
2a330 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
2a340 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
2a350 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
2a360 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
2a370 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
2a380 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
2a390 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
2a3a0 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
2a3b0 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
2a3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
2a3d0 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
2a3e0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
2a3f0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
2a400 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
2a410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2a420 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
2a430 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
2a440 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
2a450 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
2a460 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
2a470 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
2a480 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2a490 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
2a4a0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2a4b0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2a4c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
2a4d0 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
2a4e0 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
2a4f0 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
2a500 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
2a510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a520 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33  nixFetch(sqlite3
2a530 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
2a540 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
2a550 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
2a560 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2a570 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
2a580 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
2a590 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
2a5a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2a5b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
2a5c0 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
2a5d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2a5e0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
2a5f0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
2a600 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
2a610 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
2a620 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
2a630 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
2a640 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
2a650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a660 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2a670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
2a680 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
2a690 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
2a6a0 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
2a6b0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
2a6c0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
2a6d0 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
2a6e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2a6f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a700 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
2a710 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2a720 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
2a730 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2a740 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a  on releases a .*
2a750 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
2a760 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
2a770 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  er call to unixF
2a780 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
2a790 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
2a7a0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2a7b0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
2a7c0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
2a7d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2a7e0 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
2a7f0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
2a800 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f  unixFetch() invo
2a810 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f  cation. .**.** O
2a820 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  r, if the third 
2a830 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
2a840 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2a850 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
2a860 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f  lled .** to info
2a870 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
2a880 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
2a890 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
2a8a0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
2a8b0 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
2a8c0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
2a8d0 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
2a8e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2a8f0 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  xUnfetch(sqlite3
2a900 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
2a910 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
2a920 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2a930 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
2a940 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
2a950 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
2a960 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
2a970 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a990 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a  TER(iOff);..  /*
2a9a0 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
2a9b0 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
2a9c0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
2a9d0 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
2a9e0 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
2a9f0 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
2aa00 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
2aa10 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
2aa20 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
2aa30 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
2aa40 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
2aa50 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
2aa60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
2aa70 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
2aa80 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
2aa90 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
2aaa0 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
2aab0 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
2aac0 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
2aad0 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
2aae0 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
2aaf0 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
2ab00 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
2ab10 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
2ab20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
2ab30 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
2ab40 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
2ab50 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a  Out>=0 );.#else.
2ab60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ab70 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
2ab80 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
2ab90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2aba0 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a  R(iOff);.#endif.
2abb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2abc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
2abd0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
2abe0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
2abf0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
2ac00 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
2ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac20 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
2ac30 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aca0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
2acb0 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
2acc0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
2acd0 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
2ace0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2acf0 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
2ad00 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
2ad10 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2ad20 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
2ad30 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
2ad40 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
2ad50 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
2ad60 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2ad70 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
2ad80 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
2ad90 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
2ada0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
2adb0 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
2adc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2add0 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
2ade0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
2adf0 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
2ae00 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
2ae10 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
2ae20 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
2ae30 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
2ae40 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
2ae50 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
2ae60 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
2ae70 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ae80 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
2ae90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2aea0 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
2aeb0 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
2aec0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2aed0 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
2aee0 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
2aef0 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
2af00 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
2af10 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
2af20 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
2af30 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
2af40 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
2af50 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2af60 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
2af70 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
2af80 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
2af90 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
2afa0 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
2afb0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
2afc0 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
2afd0 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
2afe0 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
2aff0 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
2b000 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
2b010 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
2b020 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
2b030 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
2b040 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
2b050 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
2b060 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
2b070 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
2b080 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
2b090 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
2b0a0 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
2b0b0 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
2b0c0 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
2b0d0 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
2b0e0 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
2b0f0 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
2b100 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
2b110 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
2b120 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
2b130 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
2b140 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b150 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
2b160 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
2b170 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
2b180 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
2b190 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
2b1a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
2b1b0 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
2b1c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
2b1d0 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
2b1e0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2b1f0 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
2b200 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
2b210 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
2b220 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
2b230 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
2b240 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49  DER,METHOD,VERSI
2b250 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e  ON,CLOSE,LOCK,UN
2b260 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d  LOCK,CKLOCK,SHMM
2b270 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63  AP)     \.static
2b280 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b290 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
2b2a0 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
2b2d0 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
2b2e0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2b2f0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
2b320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b330 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2b340 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
2b370 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
2b380 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
2b390 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
2b3c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2b3d0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
2b3e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
2b410 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
2b420 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
2b430 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
2b4b0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
2b4c0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
2b4d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b510 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
2b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b540 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b560 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b590 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b5b0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2b5c0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b5e0 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
2b5f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
2b600 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b630 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b650 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b680 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
2b690 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
2b6a0 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
2b6b0 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
2b6c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53            \.   S
2b6d0 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20  HMMAP,          
2b6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b6f0 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b720 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
2b730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2b740 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b760 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2b770 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
2b780 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2b790 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2b7c0 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
2b7d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
2b7e0 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
2b810 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
2b820 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
2b830 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
2b860 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
2b870 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
2b880 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8f0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
2b900 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2b910 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
2b920 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
2b930 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
2b940 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
2b950 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
2b960 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
2b9a0 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2ba30 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2ba40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2ba50 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
2ba60 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2ba70 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
2ba80 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
2ba90 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
2baa0 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
2bab0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2bac0 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
2bad0 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
2bae0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
2baf0 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
2bb00 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
2bb10 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
2bb20 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
2bb30 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
2bb40 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
2bb50 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2bb60 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2bb70 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
2bb80 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
2bb90 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2bba0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2bbb0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
2bbc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2bbe0 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
2bbf0 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
2bc00 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc20 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2bc30 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc50 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2bc60 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc80 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2bc90 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
2bca0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
2bcb0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2bcc0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2bcd0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20  unixShmMap      
2bce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2bcf0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2bd00 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
2bd10 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
2bd20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2bd30 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2bd40 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
2bd50 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
2bd60 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2bd70 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2bd80 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2bdb0 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2bdc0 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
2bdd0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2bde0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2bdf0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2be00 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2be10 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2be20 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2be30 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2be40 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2be50 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2be60 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2be70 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck,  /* xCheckRe
2be80 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2be90 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2bec0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2bed0 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
2bee0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
2bef0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2bf00 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
2bf10 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
2bf20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2bf30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2bf40 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2bf70 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2bf80 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
2bf90 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2bfa0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2bfb0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2bfc0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2bfd0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2bfe0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
2bff0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2c000 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2c010 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2c020 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c030 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k, /* xCheckRese
2c040 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c050 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c070 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2c080 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
2c090 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c0a0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2c0b0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2c0c0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2c0d0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2c0e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2c0f0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2c100 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2c110 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2c120 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c140 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2c150 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2c160 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2c170 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2c180 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2c190 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2c1a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c1b0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2c1c0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2c1d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2c1e0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2c1f0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2c200 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2c210 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2c220 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2c230 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c250 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2c260 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2c270 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
2c280 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
2c290 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2c2a0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2c2b0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2c2c0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
2c2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2c2e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c2f0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2c300 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2c310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2c320 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2c330 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
2c340 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  XClose,         
2c350 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2c360 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2c370 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  XLock,          
2c380 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2c390 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2c3a0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2c3b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2c3c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2c3d0 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  XCheckReservedLo
2c3e0 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2c3f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2c400 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2c430 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2c440 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
2c450 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2c460 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c470 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
2c480 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
2c490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2c4a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2c4b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
2c4c0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2c4d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2c4e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2c4f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2c520 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2c530 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
2c540 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c550 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2c560 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
2c570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c580 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c590 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
2c5a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c5b0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2c5c0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
2c5d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c5e0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2c5f0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c600 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c620 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2c630 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2c640 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2c650 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
2c660 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
2c670 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
2c680 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
2c690 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
2c6a0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
2c6b0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
2c6c0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
2c6d0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
2c6e0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
2c6f0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
2c700 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
2c710 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
2c720 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
2c730 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2c740 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2c750 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
2c760 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
2c770 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
2c780 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
2c790 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
2c7a0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
2c7b0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
2c7c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
2c7d0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2c7e0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
2c7f0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
2c800 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
2c810 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
2c820 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
2c830 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2c840 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c850 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
2c860 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
2c870 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
2c880 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2c890 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
2c8a0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2c8b0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
2c8c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2c8d0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
2c8e0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
2c8f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
2c900 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
2c910 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
2c920 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
2c930 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2c940 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2c950 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
2c960 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2c970 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2c980 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2c990 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2c9c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2c9d0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c9f0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2ca00 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ca20 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2ca30 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
2ca40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2ca50 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2ca60 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
2ca70 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
2ca80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ca90 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cab0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2cac0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2cad0 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
2cae0 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
2caf0 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
2cb00 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
2cb10 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
2cb20 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
2cb30 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2cb40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2cb50 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2cb60 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
2cb70 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2cb80 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2cb90 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2cba0 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2cbc0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2cbd0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2cbe0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2cc10 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2cc20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
2cc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2cc40 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2cc50 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2cc70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2cc80 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2cca0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2ccb0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2ccc0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2ccd0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2cce0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ccf0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2cd10 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2cd20 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2cd30 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2cd40 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2cd50 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2cd60 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
2cd70 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
2cd80 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
2cd90 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
2cda0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
2cdb0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
2cdc0 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
2cdd0 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
2cde0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
2cdf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
2ce00 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
2ce10 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
2ce20 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
2ce30 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
2ce40 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2ce50 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2ce60 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2ce70 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2ce80 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2ce90 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2cea0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ceb0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2cec0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2ced0 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
2cee0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
2cef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2cf00 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
2cf10 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
2cf20 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
2cf30 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf50 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
2cf60 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
2cf70 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2cf80 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
2cf90 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
2cfa0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2cfb0 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
2cfc0 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
2cfd0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2cfe0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
2cff0 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2d000 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2d010 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
2d020 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2d030 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
2d040 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2d050 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
2d060 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
2d070 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
2d080 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2d090 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2d0a0 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
2d0b0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2d0c0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2d0d0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2d0e0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2d0f0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2d100 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2d110 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2d120 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2d130 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2d140 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2d150 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2d160 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
2d170 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
2d180 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
2d190 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
2d1a0 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
2d1b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d1c0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2d1d0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
2d1e0 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
2d1f0 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
2d200 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2d210 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2d220 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
2d230 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
2d240 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d250 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
2d260 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
2d270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
2d280 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
2d290 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
2d2a0 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
2d2b0 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
2d2c0 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
2d2d0 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
2d2e0 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
2d2f0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2d300 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2d310 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
2d320 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
2d330 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2d340 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2d350 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2d360 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2d370 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2d380 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2d390 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2d3a0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2d3b0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2d3c0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
2d3d0 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2d3e0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
2d3f0 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
2d400 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
2d410 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
2d420 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
2d430 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2d440 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2d450 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
2d460 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2d470 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2d480 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2d490 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2d4a0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2d4b0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2d4c0 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2d4d0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2d4e0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
2d4f0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2d500 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2d510 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2d520 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
2d530 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69  S./*.** This "fi
2d540 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66  nder" function f
2d550 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b  or VxWorks check
2d560 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69  s to see if posi
2d570 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f  x advisory.** lo
2d580 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66  cking works.  If
2d590 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74   it does, then t
2d5a0 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20 75  hat is what is u
2d5b0 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sed.  If it does
2d5c0 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68   not.** work, th
2d5d0 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e  en fallback to n
2d5e0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2d5f0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
2d600 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2d610 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f  io_methods *vxwo
2d620 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  rksIoFinderImpl(
2d630 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2d640 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2d650 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2d660 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2d670 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2d680 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
2d690 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
2d6a0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
2d6b0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2d6c0 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2d6d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2d6e0 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2d6f0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2d700 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2d710 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2d720 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2d730 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2d740 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2d750 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2d760 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
2d770 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
2d780 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
2d790 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
2d7a0 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
2d7b0 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
2d7c0 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
2d7d0 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
2d7e0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2d7f0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2d800 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2d810 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2d820 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2d830 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2d840 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2d850 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2d860 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2d870 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2d880 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2d890 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
2d8a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2d8b0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
2d8c0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2d8d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2d8e0 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2d8f0 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72   vxworksIoFinder
2d900 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2d910 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72  ixFile*) = vxwor
2d920 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ksIoFinderImpl;.
2d930 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
2d940 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WORKS */../*.** 
2d950 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
2d960 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
2d970 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66  o an IO method f
2d980 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
2d990 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
2d9a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2d9b0 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
2d9c0 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
2d9d0 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
2d9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2da30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da40 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
2da50 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2da60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2da80 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2da90 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2daa0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
2dab0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
2dac0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
2dad0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
2dae0 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
2daf0 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
2db00 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
2db10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
2db20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2db30 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
2db40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2db50 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
2db60 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2db70 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
2dba0 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
2dbb0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2dbc0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2dbd0 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
2dbe0 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
2dbf0 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
2dc00 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2dc10 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
2dc20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
2dc30 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2dc40 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2dc50 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
2dc60 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49  Zero or more UNI
2dc70 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a  XFILE_* values *
2dc80 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2dc90 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2dca0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2dcb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2dcc0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2dcd0 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2dce0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2dcf0 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2dd00 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2dd10 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
2dd20 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
2dd30 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
2dd40 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2dd50 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
2dd60 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
2dd70 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
2dd80 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2dd90 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2dda0 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2ddb0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
2ddc0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
2ddd0 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2dde0 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
2ddf0 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
2de00 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
2de10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2de20 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
2de30 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
2de40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2de50 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
2de60 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
2de70 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
2de80 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
2de90 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
2dea0 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
2deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dec0 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
2ded0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2dee0 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
2def0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2df00 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
2df10 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
2df20 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2df30 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
2df40 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2df50 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
2df60 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
2df70 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
2df80 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
2df90 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
2dfa0 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
2dfb0 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
2dfc0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2dfd0 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
2dfe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2dff0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  M_BKPT;.  }.#end
2e000 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2e010 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2e020 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2e030 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2e040 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2e050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2e060 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2e070 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2e080 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2e090 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2e0a0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2e0b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2e0c0 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2e0d0 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2e0e0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2e0f0 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2e100 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2e110 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2e120 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2e130 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2e140 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2e150 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2e160 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2e170 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2e180 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2e190 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2e1a0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2e1b0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2e1c0 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2e1d0 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2e1e0 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2e1f0 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2e200 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2e210 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2e220 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2e230 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2e240 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2e250 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2e260 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2e270 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2e280 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2e290 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2e2a0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2e2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e2c0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2e2d0 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2e2e0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2e2f0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2e300 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2e310 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2e320 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2e330 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2e340 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2e350 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2e360 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2e370 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e380 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2e390 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2e3a0 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2e3b0 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2e3c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2e3d0 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2e3e0 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2e3f0 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2e400 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2e410 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2e420 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2e430 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2e440 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2e450 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2e460 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2e470 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2e480 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2e490 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2e4a0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2e4b0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2e4c0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2e4d0 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2e4e0 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2e4f0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2e500 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2e510 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2e520 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2e530 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2e540 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2e550 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e560 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2e570 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2e580 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2e590 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2e5a0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2e5b0 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2e5c0 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2e5d0 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2e5e0 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2e5f0 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2e600 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2e610 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2e620 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2e630 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2e640 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2e650 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2e660 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2e670 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2e680 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2e690 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2e6a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e6b0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2e6c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2e6d0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2e6e0 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2e6f0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2e700 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2e710 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2e720 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2e730 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2e740 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2e750 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2e760 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2e770 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2e780 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2e790 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2e7a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2e7b0 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2e7c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2e7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2e7e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2e7f0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2e800 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2e810 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2e820 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2e830 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2e840 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2e850 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2e860 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2e870 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2e880 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2e890 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2e8a0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2e8b0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2e8c0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2e8d0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2e8e0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2e8f0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2e900 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2e910 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2e920 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2e930 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2e940 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2e950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e970 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2e980 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2e990 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2e9a0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2e9b0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2e9c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2e9d0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2e9e0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2e9f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2ea00 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2ea10 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2ea20 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2ea30 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2ea40 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2ea50 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2ea60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2ea70 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2ea80 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2ea90 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2eaa0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2eab0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2eac0 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2ead0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2eae0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2eaf0 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2eb00 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2eb10 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2eb20 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2eb30 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c  e3_malloc64(nFil
2eb40 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2eb50 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2eb60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2eb70 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2eb80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2eb90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2eba0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2ebb0 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2ebc0 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2ebd0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2ebe0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2ebf0 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2ec00 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2ec10 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2ec20 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2ec30 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2ec40 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2ec50 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2ec60 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2ec70 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2ec80 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2ec90 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2eca0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2ecb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2ecc0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2ecd0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2ece0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2ecf0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2ed00 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2ed10 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2ed20 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2ed30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2ed40 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2ed50 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2ed60 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2ed70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2ed80 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2ed90 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2eda0 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edc0 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2edd0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2ede0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2edf0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2ee00 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2ee10 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2ee20 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2ee30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2ee40 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2ee50 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2ee60 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2ee70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2ee80 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2ee90 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2eea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2eeb0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2eec0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2eed0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2eee0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2eef0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2ef00 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2ef10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73   }.#endif.  .  s
2ef20 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e  toreLastErrno(pN
2ef30 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56  ew, 0);.#if OS_V
2ef40 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2ef50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ef60 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2ef70 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2ef80 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2ef90 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2efa0 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2efb0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  );.    pNew->ctr
2efc0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2efd0 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23  LE_DELETE;.  }.#
2efe0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
2eff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f000 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2f010 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2f020 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
2f030 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2f040 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
2f050 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
2f060 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
2f070 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
2f080 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
2f090 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f0a0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
2f0b0 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
2f0c0 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
2f0d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
2f0e0 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
2f0f0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2f100 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
2f110 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
2f120 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2f130 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
2f140 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
2f150 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2f160 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
2f170 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
2f180 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
2f190 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
2f1a0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
2f1b0 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d  p",.     ".".  }
2f1c0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2f1d0 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74   i = 0;.  struct
2f1e0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2f1f0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2f200 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2f210 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2f220 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2f230 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2f240 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2f250 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2f260 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2f270 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2f280 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
2f290 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20    if( zDir!=0.  
2f2a0 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69     && osStat(zDi
2f2b0 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20  r, &buf)==0.    
2f2c0 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e   && S_ISDIR(buf.
2f2d0 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26  st_mode).     &&
2f2e0 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20   osAccess(zDir, 
2f2f0 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  03)==0.    ){.  
2f300 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b      return zDir;
2f310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2f320 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  >=sizeof(azDirs)
2f330 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2f340 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
2f350 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b  zDir = azDirs[i+
2f360 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +];.  }.  return
2f370 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2f380 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2f390 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2f3a0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2f3b0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2f3c0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2f3d0 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2f3e0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2f3f0 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2f400 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2f410 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2f420 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2f430 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2f440 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2f450 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2f460 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
2f470 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  0;..  /* It's od
2f480 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2f490 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2f4a0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2f4b0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2f4c0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2f4d0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2f4e0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2f4f0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2f500 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2f510 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a  iling. .  */.  z
2f520 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69  Buf[0] = 0;.  Si
2f530 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2f540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2f550 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2f560 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2f570 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2f580 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f590 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
2f5a0 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36  TH;.  do{.    u6
2f5b0 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 r;.    sqlite3
2f5c0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2f5d0 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
2f5e0 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29  assert( nBuf>2 )
2f5f0 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d  ;.    zBuf[nBuf-
2f600 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  2] = 0;.    sqli
2f610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2f620 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  f, zBuf, "%s/"SQ
2f630 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2f640 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20  REFIX"%llx%c",. 
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b      zDir, r, 0);
2f670 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42  .    if( zBuf[nB
2f680 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69  uf-2]!=0 || (iLi
2f690 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75  mit++)>10 ) retu
2f6a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2f6b0 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
2f6c0 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
2f6d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f6e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
2f6f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f700 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2f710 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
2f720 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
2f730 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
2f740 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
2f750 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
2f760 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
2f770 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
2f780 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
2f790 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
2f7a0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
2f7b0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2f7c0 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
2f7d0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2f7e0 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
2f7f0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2f800 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2f810 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2f820 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2f830 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2f840 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2f850 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2f860 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2f870 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2f880 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2f890 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2f8a0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2f8b0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2f8c0 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2f8d0 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2f8e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2f8f0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2f900 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2f910 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2f920 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2f930 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2f940 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f950 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2f960 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2f970 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2f980 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2f990 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2f9a0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2f9b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2f9c0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2f9d0 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2f9e0 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2f9f0 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2fa00 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2fa10 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2fa20 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2fa30 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2fa40 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2fa50 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2fa60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2fa70 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2fa80 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2fa90 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2faa0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2fab0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2fac0 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2fad0 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2fae0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2faf0 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2fb00 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2fb10 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2fb20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2fb30 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2fb40 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2fb50 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2fb60 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2fb70 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2fb80 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2fb90 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2fba0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2fbb0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2fbc0 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2fbd0 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2fbe0 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2fbf0 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2fc00 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2fc10 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2fc20 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2fc30 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2fc40 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2fc50 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2fc60 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2fc70 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2fc80 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2fc90 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2fca0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2fcb0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2fcc0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2fcd0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2fce0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2fcf0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2fd00 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2fd10 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72   */..  unixEnter
2fd20 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41  Mutex();..  /* A
2fd30 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2fd40 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2fd50 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2fd60 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2fd70 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2fd80 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2fd90 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2fda0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2fdb0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2fdc0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2fdd0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2fde0 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2fdf0 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2fe00 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2fe10 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2fe20 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2fe30 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2fe40 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2fe50 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2fe60 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2fe70 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2fe80 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2fe90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2fea0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2feb0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2fec0 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2fed0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2fee0 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2fef0 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65  g for a reusable
2ff00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ff10 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2ff20 2a 2f 0a 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  */.  if( inodeLi
2ff30 73 74 21 3d 30 20 26 26 20 30 3d 3d 6f 73 53 74  st!=0 && 0==osSt
2ff40 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
2ff50 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
2ff60 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
2ff70 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
2ff80 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
2ff90 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
2ffa0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
2ffb0 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffd0 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
2ffe0 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34  fileId.ino!=(u64
2fff0 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  )sStat.st_ino) )
30000 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
30010 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
30020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30030 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
30040 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
30050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
30070 74 68 65 6c 64 28 70 49 6e 6f 64 65 2d 3e 70 4c  theld(pInode->pL
30080 6f 63 6b 4d 75 74 65 78 29 20 29 3b 0a 20 20 20  ockMutex) );.   
30090 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
300a0 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70  _enter(pInode->p
300b0 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20  LockMutex);.    
300c0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
300d0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
300e0 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
300f0 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
30100 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
30110 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
30120 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
30130 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
30140 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
30150 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
30160 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
30170 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
30180 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ockMutex);.    }
30190 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
301a0 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20  Mutex();.#endif 
301b0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
301c0 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
301d0 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
301e0 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65  ** Find the mode
301f0 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66  , uid and gid of
30200 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f   file zFile. .*/
30210 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 46  .static int getF
30220 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
30230 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20   char *zFile,   
30240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
30250 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64  le name */.  mod
30260 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30280 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
30290 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75   of zFile */.  u
302a0 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
302b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
302c0 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46  * OUT: uid of zF
302d0 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20  ile. */.  gid_t 
302e0 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
302f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
30300 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20  : gid of zFile. 
30310 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  */.){.  struct s
30320 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
30330 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30340 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
30350 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
30360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30370 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f  E_OK;.  if( 0==o
30380 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53  sStat(zFile, &sS
30390 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  tat) ){.    *pMo
303a0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
303b0 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a  de & 0777;.    *
303c0 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
303d0 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d  uid;.    *pGid =
303e0 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
303f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
30400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
30410 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TAT;.  }.  retur
30420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
30430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30440 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
30450 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
30460 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
30470 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
30480 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
30490 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
304a0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
304b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
304c0 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
304d0 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
304e0 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
304f0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
30500 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
30510 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
30520 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30530 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
30540 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
30550 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
30560 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
30570 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
30580 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
30590 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20  ost cases, this 
305a0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
305b0 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
305c0 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
305d0 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
305e0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
305f0 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
30600 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
30610 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
30620 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
30630 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
30640 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
30650 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
30660 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
30670 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
30680 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
30690 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
306a0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
306b0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
306c0 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
306d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
306e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
306f0 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
30700 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
30710 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
30720 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
30730 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
30740 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
30750 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
30760 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
30770 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
30780 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
30790 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
307a0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
307b0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
307c0 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
307d0 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
307e0 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
307f0 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
30800 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
30810 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
30820 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
30830 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
30840 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
30850 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
30860 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
30870 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
30880 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
30890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
308a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
308b0 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
308c0 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
308d0 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
308e0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30900 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
30910 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
30920 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
30930 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30950 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
30960 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
30970 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
30980 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
30990 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
309a0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
309b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
309c0 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
309d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
309e0 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
309f0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
30a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30a10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
30a30 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
30a40 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
30a50 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
30a60 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
30a70 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
30a80 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30a90 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
30aa0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
30ab0 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
30ac0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
30ad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30af0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30b00 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
30b10 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n zDb */..    /*
30b20 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
30b30 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
30b40 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
30b50 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
30b60 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
30b70 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
30b80 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
30b90 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
30ba0 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
30bb0 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
30bc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
30bd0 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
30be0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
30bf0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
30c00 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
30c10 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
30c20 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
30c30 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
30c40 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
30c50 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
30c60 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
30c70 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
30c80 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
30c90 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
30ca0 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
30cb0 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
30cc0 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
30cd0 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
30ce0 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
30cf0 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
30d00 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  ; .    while( zP
30d10 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
30d20 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72  .      /* In nor
30d30 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  mal operation, t
30d40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30d50 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  name will always
30d60 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a   contain.      *
30d70 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65  * a '-' characte
30d80 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38  r.  However in 8
30d90 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65  +3 filename mode
30da0 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70  , or if a corrup
30db0 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
30dc0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63  ack journal spec
30dd0 69 66 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a  ifies a master j
30de0 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f  ournal with a go
30df0 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20  ofy name, then. 
30e00 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20       ** the '-' 
30e10 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67  might be missing
30e20 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
30e30 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
30e40 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72  Db]=='.' ) retur
30e50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
30e60 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
30e70 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
30e80 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
30e90 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
30ea0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46  ;..    rc = getF
30eb0 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f  ileMode(zDb, pMo
30ec0 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b  de, pUid, pGid);
30ed0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
30ee0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30ef0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
30f00 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
30f10 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  600;.  }else if(
30f20 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
30f30 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20  OPEN_URI ){.    
30f40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
30f50 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
30f60 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
30f70 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
30f80 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69   a URI.    ** fi
30f90 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f  lename, check fo
30fa0 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70  r the "modeof" p
30fb0 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65  arameter. If pre
30fc0 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a  sent, interpret.
30fd0 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65      ** its value
30fe0 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61   as a filename a
30ff0 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  nd try to copy t
31000 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64  he mode, uid and
31010 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a   gid from.    **
31020 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a   that file.  */.
31030 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31040 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
31050 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c  parameter(zPath,
31060 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20   "modeof");.    
31070 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72  if( z ){.      r
31080 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  c = getFileMode(
31090 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20  z, pMode, pUid, 
310a0 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pGid);.    }.  }
310b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
310c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
310d0 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
310e0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
310f0 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
31100 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
31110 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
31120 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
31130 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
31140 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
31150 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
31160 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
31170 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
31180 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
31190 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
311a0 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
311b0 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
311c0 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
311d0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
311e0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
311f0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
31200 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
31210 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
31220 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
31230 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
31240 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
31250 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
31260 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
31270 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
31280 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
31290 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
312a0 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
312b0 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
312c0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
312d0 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
312e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
312f0 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
31300 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
31310 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
31320 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
31330 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
31340 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
31350 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
31360 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
31370 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
31380 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
31390 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
313a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
313b0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
313c0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
313d0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
313e0 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
313f0 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
31400 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31410 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
31420 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
31430 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
31440 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
31450 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
31460 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
31470 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
31480 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
31490 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
314a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
314b0 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
314c0 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
314d0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
314e0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
314f0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
31500 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
31510 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
31520 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
31530 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
31540 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
31550 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
31560 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
31570 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
31580 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
31590 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
315a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
315b0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
315c0 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
315d0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
315e0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
315f0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
31600 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
31610 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31630 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
31640 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
31650 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
31660 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31670 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
31680 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
31690 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
316a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
316b0 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
316c0 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
316d0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
316e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
316f0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
31700 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
31710 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
31720 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
31730 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
31740 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
31750 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
31760 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
31770 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
31780 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
31790 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
317a0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
317b0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
317c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
317d0 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
317e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
317f0 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
31800 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
31810 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31820 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
31830 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
31840 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
31850 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
31860 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
31870 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
31880 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
31890 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
318a0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
318b0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
318c0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
318d0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
318e0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
318f0 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
31900 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
31910 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
31920 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
31930 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
31940 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
31950 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
31960 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
31970 69 73 4e 65 77 4a 72 6e 6c 20 3d 20 28 69 73 43  isNewJrnl = (isC
31980 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
31990 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
319a0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
319b0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
319c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
319d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
319e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
319f0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
31a00 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67  ));..  /* If arg
31a10 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
31a20 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
31a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31a40 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
31a50 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
31a60 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
31a70 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
31a80 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
31a90 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
31aa0 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
31ab0 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+2];.  const
31ac0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
31ad0 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
31ae0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
31af0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
31b00 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
31b10 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
31b20 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
31b30 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
31b40 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
31b50 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
31b60 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
31b70 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
31b80 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
31b90 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
31ba0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
31bb0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
31bc0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
31bd0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
31be0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
31bf0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
31c00 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
31c10 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
31c20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
31c30 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
31c40 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
31c50 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
31c60 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
31c70 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
31c80 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
31c90 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
31ca0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
31cb0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
31cc0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
31cd0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
31ce0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
31cf0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
31d00 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
31d10 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
31d20 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
31d30 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
31d40 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
31d50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
31d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
31d70 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
31d80 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
31d90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
31da0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
31db0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
31dc0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
31dd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31de0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
31df0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
31e00 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
31e10 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
31e20 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
31e30 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
31e40 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
31e50 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
31e60 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
31e70 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
31e80 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
31e90 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
31ea0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
31eb0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
31ec0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
31ed0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
31ee0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
31ef0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
31f00 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
31f10 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
31f20 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
31f30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
31f40 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
31f50 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
31f60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
31f70 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
31f80 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
31f90 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
31fa0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
31fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
31fc0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
31fd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
31fe0 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  AL.  );..  /* De
31ff0 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e 67  tect a pid chang
32000 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
32010 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20  PRNG.  There is 
32020 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
32030 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20  .  ** here such 
32040 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65  that two or more
32050 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79   threads all try
32060 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ing to open data
32070 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68  bases at.  ** th
32080 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d  e same instant m
32090 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74  ight all reset t
320a0 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75  he PRNG.  But mu
320b0 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20  ltiple resets.  
320c0 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e  ** are harmless.
320d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64  .  */.  if( rand
320e0 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74  omnessPid!=osGet
320f0 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61  pid(0) ){.    ra
32100 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
32110 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73  Getpid(0);.    s
32120 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
32130 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 6d 65  s(0,0);.  }.  me
32140 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
32150 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
32160 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
32170 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
32180 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
32190 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
321a0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
321b0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
321c0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
321d0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
321e0 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
321f0 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
32200 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
32210 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
32220 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
32230 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
32240 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
32250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32260 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
32270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
32280 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
32290 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
322a0 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
322b0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
322c0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
322d0 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
322e0 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
322f0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
32300 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
32310 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
32320 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
32330 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
32340 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
32350 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
32360 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
32370 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
32380 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
32390 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
323a0 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
323b0 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
323c0 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
323d0 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
323e0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
323f0 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
32400 6c 65 74 65 20 26 26 20 21 69 73 4e 65 77 4a 72  lete && !isNewJr
32410 6e 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  nl);.    rc = un
32420 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  ixGetTempname(pV
32430 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
32440 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
32450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
32470 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
32480 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
32490 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
324a0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
324b0 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
324c0 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
324d0 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
324e0 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
324f0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
32500 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
32510 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
32520 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
32530 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
32540 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
32550 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
32560 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
32570 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
32580 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
32590 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
325a0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
325b0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
325c0 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
325d0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
325e0 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
325f0 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
32600 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
32610 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
32620 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
32630 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
32640 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
32650 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
32660 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
32670 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
32680 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
32690 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
326a0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
326b0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
326c0 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
326d0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
326e0 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
326f0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
32700 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
32710 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
32720 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
32730 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
32740 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
32750 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
32760 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
32770 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
32780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32790 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
327a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
327b0 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
327c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
327d0 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
327e0 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
327f0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
32800 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
32810 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
32820 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
32830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
32850 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
32860 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
32870 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
32880 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
32890 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
328a0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
328b0 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
328c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
328d0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
328e0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
328f0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
32900 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
32910 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
32920 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
32930 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
32940 61 73 73 65 72 74 28 20 21 69 73 45 78 63 6c 75  assert( !isExclu
32950 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61  sive || (openFla
32960 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21 3d 30  gs & O_CREAT)!=0
32970 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30   );.    if( fd<0
32980 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
32990 4e 65 77 4a 72 6e 6c 20 26 26 20 65 72 72 6e 6f  NewJrnl && errno
329a0 3d 3d 45 41 43 43 45 53 20 26 26 20 6f 73 41 63  ==EACCES && osAc
329b0 63 65 73 73 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b  cess(zName, F_OK
329c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
329d0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65  If unable to cre
329e0 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65  ate a journal be
329f0 63 61 75 73 65 20 74 68 65 20 64 69 72 65 63 74  cause the direct
32a00 6f 72 79 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  ory is not.     
32a10 20 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2c 20     ** writable, 
32a20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72  change the error
32a30 20 63 6f 64 65 20 74 6f 20 69 6e 64 69 63 61 74   code to indicat
32a40 65 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20  e that. */.     
32a50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
32a60 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52  EADONLY_DIRECTOR
32a70 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
32a80 66 28 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  f( errno!=EISDIR
32a90 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
32aa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
32ab0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
32ac0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
32ad0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
32ae0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
32af0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
32b00 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
32b10 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
32b20 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
32b30 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
32b40 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
32b50 41 54 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  AT);.        fla
32b60 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
32b70 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
32b80 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
32b90 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
32ba0 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
32bb0 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  1;.        fd = 
32bc0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
32bd0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
32be0 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  enMode);.      }
32bf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
32c00 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d<0 ){.      int
32c10 20 72 63 32 20 3d 20 75 6e 69 78 4c 6f 67 45 72   rc2 = unixLogEr
32c20 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
32c30 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
32c40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
32c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32c60 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
32c70 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
32c80 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
32c90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
32ca0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
32cb0 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
32cc0 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
32cd0 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
32ce0 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
32cf0 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
32d00 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
32d10 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
32d20 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
32d30 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
32d40 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
32d50 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
32d60 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
32d70 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
32d80 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
32d90 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68  .      robustFch
32da0 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
32db0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
32dc0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
32dd0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
32de0 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
32df0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
32e00 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c    if( p->pPreall
32e10 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a  ocatedUnused ){.
32e20 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63      p->pPrealloc
32e30 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d  atedUnused->fd =
32e40 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65   fd;.    p->pPre
32e50 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d  allocatedUnused-
32e60 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
32e70 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
32e80 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
32e90 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
32ea0 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64  = zName;.#elif d
32eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
32ec0 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
32ed0 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71  ).    zPath = sq
32ee0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
32ef0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
32f00 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a  if( zPath==0 ){.
32f10 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
32f20 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
32f30 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  __);.      retur
32f40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
32f50 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  KPT;.    }.#else
32f60 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
32f70 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
32f80 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
32f90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32fa0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
32fb0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
32fc0 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
32fd0 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  f.  .#if defined
32fe0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
32ff0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33000 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
33010 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
33020 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
33030 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
33040 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  o(p, errno);.   
33050 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
33060 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
33070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33080 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
33090 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
330a0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
330b0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
330c0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
330d0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
330e0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
330f0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
33100 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
33110 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
33120 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
33130 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
33140 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
33150 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
33160 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
33170 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
33180 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
33190 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
331a0 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
331b0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
331c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
331d0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
331e0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
331f0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
33210 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
33220 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c  LE_RDONLY;.  noL
33230 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
33240 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
33250 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ;.  if( noLock )
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33270 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
33280 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
33290 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20    if( isNewJrnl 
332a0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
332b0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
332c0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
332d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
332e0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63  ITE_OPEN_URI ) c
332f0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
33300 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53  FILE_URI;..#if S
33310 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33320 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
33330 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
33340 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
33350 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
33360 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
33370 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
33380 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
33390 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
333a0 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
333b0 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
333c0 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
333d0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
333e0 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
333f0 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
33400 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
33410 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
33420 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
33430 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
33440 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
33450 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
33460 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
33470 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
33480 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
33490 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
334a0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
334b0 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
334c0 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
334d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73   }else{.      us
334e0 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
334f0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
33500 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
33510 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
33520 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
33530 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
33540 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
33550 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  , ctrlFlags);.  
33560 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33580 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
33590 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e  formUnixFile((un
335a0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22  ixFile*)pFile, "
335b0 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20  :auto:");.      
335c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
335d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
335e0 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73   /* Use unixClos
335f0 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  e to clean up th
33600 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65  e resources adde
33610 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  d in fillInUnixF
33620 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ile .          *
33630 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20  * and clear all 
33640 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20  the structure's 
33650 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65  references.  Spe
33660 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20  cifically, .    
33670 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e        ** pFile->
33680 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65  pMethods will be
33690 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33   NULL so sqlite3
336a0 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20  OsClose will be 
336b0 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20  a no-op .       
336c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
336d0 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
336e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
336f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
33700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
33710 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
33720 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
33730 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28  dif.  .  assert(
33740 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61   zPath==0 || zPa
33750 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  th[0]=='/' .    
33760 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
33770 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
33780 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
33790 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
337a0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a  N_JOURNAL .  );.
337b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
337c0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
337d0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
337e0 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
337f0 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
33800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33820 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  e(p->pPreallocat
33830 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  edUnused);.  }. 
33840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
33850 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
33860 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
33870 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
33880 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
33890 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
338a0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
338b0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
338c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
338d0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
338e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
338f0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
33900 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
33910 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
33920 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
33930 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
33940 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
33950 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
33960 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
33970 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
33980 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
33990 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
339a0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
339b0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
339c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
339d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
339e0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
339f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
33a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
33a10 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
33a20 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
33a30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
33a40 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
33a50 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
33a60 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
33a70 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
33a80 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
33a90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33aa0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
33ab0 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
33ac0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
33ad0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
33ae0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
33af0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
33b00 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
33b10 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
33b20 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
33b30 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
33b40 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
33b50 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
33b60 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
33b70 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
33b80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
33b90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33ba0 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28   if( full_fsync(
33bb0 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
33bc0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
33bd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
33be0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
33bf0 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
33c00 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
33c10 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
33c20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
33c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
33c40 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
33c50 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
33c60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
33c80 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
33c90 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
33ca0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72   existence of or
33cb0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
33cc0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
33cd0 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
33ce0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
33cf0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
33d00 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
33d10 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
33d20 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
33d30 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
33d40 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
33d50 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
33d60 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
33d70 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
33d80 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
33d90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
33da0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
33db0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
33dc0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
33dd0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
33de0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
33df0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
33e00 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
33e10 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
33e20 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
33e30 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
33e40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
33e50 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
33e60 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
33e70 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
33e80 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
33e90 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
33ea0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
33eb0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
33ec0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
33ed0 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
33ee0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
33ef0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
33f00 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
33f10 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
33f20 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
33f40 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
33f50 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
33f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
33f70 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Out!=0 );..  /* 
33f80 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74 68  The spec says th
33f90 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f  ere are three po
33fa0 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f  ssible values fo
33fb0 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e  r flags.  But on
33fc0 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74  ly.  ** two of t
33fd0 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hem are actually
33fe0 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72   used */.  asser
33ff0 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  t( flags==SQLITE
34000 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c  _ACCESS_EXISTS |
34010 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  | flags==SQLITE_
34020 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
34030 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   );..  if( flags
34040 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
34050 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74  EXISTS ){.    st
34060 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
34070 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30     *pResOut = (0
34080 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
34090 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
340a0 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65  size>0);.  }else
340b0 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
340c0 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c   osAccess(zPath,
340d0 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a   W_OK|R_OK)==0;.
340e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
340f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
34100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
34110 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  kFullPathname(. 
34120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
34130 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
34140 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a   /* Input path *
34150 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  /.  char *zOut, 
34160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34170 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
34180 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ffer */.  int nO
34190 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
341a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
341b0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62  ocated size of b
341c0 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b  uffer zOut */.){
341d0 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73  .  int nPath = s
341e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
341f0 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66  Path);.  int iOf
34200 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61  f = 0;.  if( zPa
34210 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  th[0]!='/' ){.  
34220 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
34230 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20  Out, nOut-2)==0 
34240 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
34250 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
34260 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
34270 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
34280 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  th);.    }.    i
34290 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Off = sqlite3Str
342a0 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20  len30(zOut);.   
342b0 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20   zOut[iOff++] = 
342c0 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  '/';.  }.  if( (
342d0 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f  iOff+nPath+1)>nO
342e0 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ut ){.    /* SQL
342f0 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ite assumes that
34300 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29   xFullPathname()
34310 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20   nul-terminates 
34320 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
34330 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66  r.    ** even if
34340 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65   it returns an e
34350 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f  rror.  */.    zO
34360 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b  ut[iOff] = '\0';
34370 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34380 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
34390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
343a0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f  snprintf(nOut-iO
343b0 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c  ff, &zOut[iOff],
343c0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
343d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
343e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  K;.}../*.** Turn
343f0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
34400 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
34410 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
34420 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
34430 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
34440 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
34450 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
34460 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
34470 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
34480 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
34490 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
344a0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
344b0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
344c0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
344d0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
344e0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
344f0 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
34500 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
34510 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
34520 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
34530 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
34540 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
34550 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
34560 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
34570 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
34580 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
34590 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
345a0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
345b0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
345c0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
345d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
345e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
345f0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
34600 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
34610 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
34620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
34630 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
34640 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
34650 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c  HAVE_READLINK) |
34660 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | !defined(HAVE_
34670 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20  LSTAT).  return 
34680 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  mkFullPathname(z
34690 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
346a0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  );.#else.  int r
346b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
346c0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
346d0 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20  t nLink = 1;    
346e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
346f0 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69  umber of symboli
34700 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64  c links followed
34710 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e   so far */.  con
34720 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  st char *zIn = z
34730 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Path;      /* In
34740 70 75 74 20 70 61 74 68 20 66 6f 72 20 65 61 63  put path for eac
34750 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  h iteration of l
34760 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  oop */.  char *z
34770 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Del = 0;..  asse
34780 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
34790 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
347a0 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
347b0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
347c0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
347d0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
347e0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
347f0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
34800 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
34810 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
34820 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
34830 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
34840 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
34850 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
34860 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
34870 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
34880 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
34890 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
348a0 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
348b0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
348c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
348d0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
348e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
348f0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20  );..  do {..    
34900 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f  /* Call stat() o
34910 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20  n path zIn. Set 
34920 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66  bLink to true if
34930 20 74 68 65 20 70 61 74 68 20 69 73 20 61 20 73   the path is a s
34940 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c  ymbolic.    ** l
34950 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ink, or false ot
34960 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20  herwise.  */.   
34970 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a   int bLink = 0;.
34980 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
34990 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c  buf;.    if( osL
349a0 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21  stat(zIn, &buf)!
349b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
349c0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
349d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
349e0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
349f0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
34a00 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a   "lstat", zIn);.
34a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34a20 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d  e{.      bLink =
34a30 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f   S_ISLNK(buf.st_
34a40 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  mode);.    }..  
34a50 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20    if( bLink ){. 
34a60 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
34a70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c   ){.        zDel
34a80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
34a90 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  c(nOut);.       
34aa0 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72   if( zDel==0 ) r
34ab0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
34ac0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
34ad0 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53  se if( ++nLink>S
34ae0 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e  QLITE_MAX_SYMLIN
34af0 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  KS ){.        rc
34b00 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
34b10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EN_BKPT;.      }
34b20 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
34b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34b40 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52       nByte = osR
34b50 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65  eadlink(zIn, zDe
34b60 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20  l, nOut-1);.    
34b70 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20      if( nByte<0 
34b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
34b90 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
34ba0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
34bb0 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c  KPT, "readlink",
34bc0 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d   zIn);.        }
34bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34be0 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27  if( zDel[0]!='/'
34bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34c00 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
34c10 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74     for(n = sqlit
34c20 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b  e3Strlen30(zIn);
34c30 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d   n>0 && zIn[n-1]
34c40 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20  !='/'; n--);.   
34c50 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79           if( nBy
34c60 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20  te+n+1>nOut ){. 
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
34c80 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
34c90 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
34ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34cb0 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
34cc0 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c  (&zDel[n], zDel,
34cd0 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20   nByte+1);.     
34ce0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
34cf0 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20  zDel, zIn, n);. 
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
34d10 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  te += n;.       
34d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
34d30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65   }.          zDe
34d40 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b  l[nByte] = '\0';
34d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34d60 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20   }..      zIn = 
34d70 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  zDel;.    }..   
34d80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34d90 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a  ITE_OK || zIn!=z
34da0 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27  Out || zIn[0]=='
34db0 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  /' );.    if( rc
34dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
34dd0 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20  In!=zOut ){.    
34de0 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74    rc = mkFullPat
34df0 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c  hname(zIn, zOut,
34e00 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   nOut);.    }.  
34e10 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29    if( bLink==0 )
34e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20   break;.    zIn 
34e30 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65  = zOut;.  }while
34e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34e50 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
34e60 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75  ee(zDel);.  retu
34e70 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20  rn rc;.#endif   
34e80 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b  /* HAVE_READLINK
34e90 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a   && HAVE_LSTAT *
34ea0 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  /.}...#ifndef SQ
34eb0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
34ec0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
34ed0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
34ee0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
34ef0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
34f00 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
34f10 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
34f20 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
34f30 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
34f40 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
34f50 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
34f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
34f70 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
34f80 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
34f90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
34fa0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
34fb0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34fc0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
34fd0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
34fe0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
34ff0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
35000 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
35010 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
35020 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
35030 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
35040 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
35050 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
35060 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
35070 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
35080 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
35090 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
350a0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
350b0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
350c0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
350d0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
350e0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
350f0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
35100 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
35110 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
35120 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
35130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
35140 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
35150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
35160 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
35170 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
35180 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
35190 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
351a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
351b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
351c0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
351d0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
351e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
351f0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
35200 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
35210 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
35220 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
35230 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
35240 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
35250 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
35260 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
35270 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
35280 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
35290 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
352a0 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
352b0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
352c0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
352d0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
352e0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
352f0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
35300 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
35310 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
35320 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
35330 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
35340 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
35350 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
35360 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
35370 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
35380 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
35390 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
353a0 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
353b0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
353c0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
353d0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
353e0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
353f0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
35400 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
35410 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
35420 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
35430 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
35440 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
35450 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
35460 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
35470 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
35480 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
35490 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
354a0 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
354b0 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
354c0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
354d0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
354e0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
354f0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
35500 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
35510 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
35520 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
35530 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
35540 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
35550 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
35560 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
35570 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
35580 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
35590 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
355a0 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
355b0 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
355c0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
355d0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
355e0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
355f0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
35600 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
35610 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
35620 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
35630 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
35640 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
35650 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
35660 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
35670 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
35680 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
35690 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
356a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
356b0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
356c0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
356d0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
356e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
356f0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
35700 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
35710 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
35720 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
35730 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
35740 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
35750 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
35760 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
35770 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
35780 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
35790 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
357a0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
357b0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
357c0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
357d0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
357e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
357f0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
35800 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35810 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
35820 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
35830 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
35840 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
35850 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
35860 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
35870 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
35880 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
35890 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
358a0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
358b0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
358c0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
358d0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
358e0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
358f0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
35900 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
35910 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
35920 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
35930 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
35940 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
35950 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
35960 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
35970 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
35980 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
35990 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
359a0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
359b0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
359c0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
359d0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
359e0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
359f0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
35a00 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
35a10 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
35a20 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
35a30 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
35a40 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
35a50 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
35a60 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
35a70 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
35a80 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
35a90 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
35aa0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
35ab0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
35ac0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
35ad0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
35ae0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
35af0 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
35b00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
35b10 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
35b20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
35b30 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
35b40 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
35b50 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
35b60 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
35b70 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
35b80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
35b90 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
35ba0 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
35bb0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
35bc0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
35bd0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
35be0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
35bf0 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
35c00 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
35c10 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
35c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
35c30 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
35c40 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
35c50 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
35c60 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
35c70 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
35c80 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
35c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35ca0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
35cb0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
35cc0 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
35cd0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
35ce0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
35cf0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
35d00 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
35d10 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
35d20 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
35d30 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
35d40 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
35d50 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
35d60 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
35d70 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
35d80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
35d90 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
35da0 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
35db0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
35dc0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
35dd0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
35de0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
35df0 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
35e00 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
35e10 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
35e20 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
35e30 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
35e40 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
35e50 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
35e60 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
35e70 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
35e80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
35e90 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
35ea0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
35eb0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
35ec0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
35ed0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
35ee0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
35ef0 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
35f00 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
35f10 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
35f20 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
35f30 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
35f40 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
35f50 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
35f60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35f70 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
35f80 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
35f90 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
35fa0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
35fb0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
35fc0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
35fd0 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
35fe0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
35ff0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
36000 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
36010 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
36020 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
36030 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
36040 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
36050 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36060 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
36070 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
36080 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
36090 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
360a0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
360b0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
360c0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
360d0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
360e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
360f0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
36100 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
36110 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
36120 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
36130 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
36140 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
36150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
36160 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
36170 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
36180 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
36190 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
361a0 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
361b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
361c0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
361d0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
361e0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
361f0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
36200 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
36210 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
36220 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
36230 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
36240 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
36250 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
36260 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
36270 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
36280 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
36290 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
362a0 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
362b0 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
362c0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
362d0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
362e0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
362f0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
36300 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
36310 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
36320 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
36330 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
36340 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
36350 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
36360 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
36370 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
36380 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
36390 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
363a0 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
363b0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
363c0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
363d0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
363e0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
363f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
36400 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
36410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
36420 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
36430 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
36440 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
36450 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
36460 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
36470 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
36480 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
36490 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
364a0 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
364b0 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
364c0 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
364d0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
364e0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
364f0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
36500 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
36510 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
36520 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
36530 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67   sNow;.  (void)g
36540 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
36550 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  w, 0);  /* Canno
36560 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c  t fail given val
36570 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  id arguments */.
36580 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
36590 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
365a0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
365b0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
365c0 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
365d0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
365e0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
365f0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
36600 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
36610 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
36620 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
36630 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
36640 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
36650 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
36660 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
36670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36690 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
366a0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
366b0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
366c0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
366d0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
366e0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
366f0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
36700 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
36710 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
36720 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
36730 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
36740 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
36750 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
36760 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
36770 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
36780 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
36790 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
367a0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
367b0 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
367c0 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
367d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
367e0 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
367f0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
36800 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
36810 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
36820 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
36830 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
36840 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
36850 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
36860 20 54 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   The xGetLastErr
36870 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64  or() method is d
36880 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72  esigned to retur
36890 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f  n a better.** lo
368a0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
368b0 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61  ssage when opera
368c0 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
368d0 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
368e0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
368f0 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74  eration.  Only t
36900 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
36910 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e  n code is curren
36920 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a  tly.** used..*/.
36930 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
36940 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
36950 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
36960 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
36970 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
36980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36990 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
369a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
369b0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
369c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
369d0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
369e0 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn errno;.}.../*
369f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
36a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
36a10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
36a20 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
36a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
36a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
36a90 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
36aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ae0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
36af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
36b00 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
36b10 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
36b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b30 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
36b40 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
36b50 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
36b60 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
36b70 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
36b80 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
36b90 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
36ba0 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
36bb0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
36bc0 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
36bd0 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
36be0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
36bf0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
36c00 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
36c10 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
36c20 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
36c30 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
36c40 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
36c50 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
36c60 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
36c70 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
36c80 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
36c90 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
36ca0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
36cb0 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
36cc0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
36cd0 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
36ce0 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
36cf0 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
36d00 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
36d10 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
36d20 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
36d30 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
36d40 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
36d50 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
36d60 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
36d70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
36d80 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
36d90 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
36da0 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
36db0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
36dc0 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
36dd0 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
36de0 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
36df0 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
36e00 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
36e10 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
36e20 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
36e30 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
36e40 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
36e50 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
36e60 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
36e70 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
36e80 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
36e90 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
36ea0 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
36eb0 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
36ec0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
36ed0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
36ee0 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
36ef0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
36f00 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
36f10 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
36f20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
36f30 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
36f40 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
36f50 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
36f60 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
36f70 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
36f80 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
36f90 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
36fa0 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
36fb0 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
36fc0 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
36fd0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
36fe0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36ff0 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
37000 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
37010 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
37020 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
37030 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
37040 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
37050 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
37060 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
37070 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
37080 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
37090 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
370a0 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
370b0 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
370c0 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
370d0 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
370e0 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
370f0 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
37100 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
37110 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
37120 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
37130 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
37140 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
37150 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
37160 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
37170 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
37180 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
37190 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
371a0 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
371b0 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
371c0 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
371d0 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
371e0 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
371f0 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
37200 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
37210 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
37220 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
37230 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
37240 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
37250 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
37260 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
37270 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
37280 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
37290 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
372a0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
372b0 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
372c0 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
372d0 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
372e0 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
372f0 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
37300 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
37310 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
37320 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
37330 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
37340 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
37350 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
37360 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
37370 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
37380 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
37390 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
373a0 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
373b0 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
373c0 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
373d0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
373e0 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
373f0 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
37400 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
37410 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
37420 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
37430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37440 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
37450 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
37460 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
37470 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
37480 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
37490 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
374a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374b0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
374c0 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
374d0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
374e0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
374f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
37500 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
37510 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
37520 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
37530 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
37540 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
37550 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
37560 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
37570 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
37580 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
37590 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
375a0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
375b0 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
375c0 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
375d0 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
375e0 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
375f0 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
37600 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
37610 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
37620 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
37630 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
37640 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
37650 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
37660 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
37670 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
37680 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
37690 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
376a0 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
376b0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
376c0 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
376d0 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
376e0 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
376f0 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
37700 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
37710 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
37720 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
37730 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
37740 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
37750 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
37760 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
37770 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
37780 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
37790 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
377a0 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
377b0 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
377c0 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
377d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
377e0 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
377f0 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
37800 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
37810 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
37820 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
37830 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
37840 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
37850 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
37860 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
37870 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
37880 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
37890 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
378a0 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
378b0 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
378c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
378d0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
378e0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
378f0 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
37900 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
37910 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
37920 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
37930 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
37940 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
37950 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
37960 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
37970 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
37980 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
37990 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
379a0 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
379b0 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
379c0 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
379d0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
379e0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
379f0 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
37a00 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
37a10 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
37a20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
37a30 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
37a40 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
37a50 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
37a60 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
37a70 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
37a80 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
37a90 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
37aa0 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
37ab0 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
37ac0 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
37ad0 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
37ae0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
37af0 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
37b00 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
37b10 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
37b20 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
37b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37b40 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
37b50 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
37b60 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
37b70 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
37b80 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
37b90 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
37ba0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
37bb0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
37bc0 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
37bd0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
37be0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
37bf0 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
37c00 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
37c10 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
37c20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
37c30 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
37c40 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
37c50 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
37c60 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
37c70 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
37c80 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
37c90 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
37ca0 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
37cb0 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
37cc0 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
37cd0 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
37ce0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
37cf0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
37d00 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
37d10 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
37d20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
37d30 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
37d40 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
37d50 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
37d60 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
37d70 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
37d80 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
37d90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37da0 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
37db0 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
37dc0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
37dd0 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
37de0 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
37df0 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
37e00 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
37e10 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
37e20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
37e30 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
37e40 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
37e50 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
37e60 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
37e70 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
37e80 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
37e90 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
37ea0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
37eb0 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
37ec0 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
37ed0 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
37ee0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
37ef0 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
37f00 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
37f10 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
37f20 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
37f30 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
37f40 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
37f50 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
37f60 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
37f70 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
37f80 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
37f90 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
37fa0 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
37fb0 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
37fc0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
37fd0 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
37fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
37ff0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
38000 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
38010 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
38020 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
38030 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
38040 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
38050 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
38060 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
38070 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
38080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
38090 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
380a0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
380b0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
380c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
380d0 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
380e0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
380f0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
38100 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
38110 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
38120 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
38130 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
38140 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
38150 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
38160 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
38170 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
38180 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
38190 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
381a0 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
381b0 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
381c0 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
381d0 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
381e0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
381f0 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
38200 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
38210 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
38220 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
38230 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
38240 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
38250 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
38260 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
38270 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
38280 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
38290 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
382a0 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
382b0 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
382c0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
382d0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
382e0 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
382f0 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
38300 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
38310 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
38320 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
38330 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
38340 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
38350 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
38360 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
38370 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
38380 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
38390 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
383a0 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
383b0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
383c0 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
383d0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
383e0 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
383f0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
38400 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
38410 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
38420 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
38430 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
38440 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
38450 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
38460 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
38470 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
38480 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
38490 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
384a0 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
384b0 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
384c0 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
384d0 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
384e0 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
384f0 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
38500 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
38510 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
38520 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
38530 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
38540 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
38550 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
38560 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
38570 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
38580 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
38590 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a