/ Hex Artifact Content
Login

Artifact a5c0e3fe58b85c81fafd16f8c663c931ba38b364:


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 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
0480: 66 20 64 69 76 69 73 69 6f 6e 73 20 69 73 20 61  f divisions is a
0490: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
04a0: 20 20 20 2a 20 20 47 65 6e 65 72 61 6c 2d 70 75     *  General-pu
04b0: 72 70 6f 73 65 20 64 65 63 6c 61 72 61 74 69 6f  rpose declaratio
04c0: 6e 73 20 61 6e 64 20 75 74 69 6c 69 74 79 20 66  ns and utility f
04d0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a  unctions..**   *
04e0: 20 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44    Unique file ID
04f0: 20 6c 6f 67 69 63 20 75 73 65 64 20 62 79 20 56   logic used by V
0500: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 20 20 2a 20 20  xWorks..**   *  
0510: 56 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  Various locking 
0520: 70 72 69 6d 69 74 69 76 65 20 69 6d 70 6c 65 6d  primitive implem
0530: 65 6e 74 61 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20  entations:.**   
0540: 20 20 20 2b 20 66 6f 72 20 50 6f 73 69 78 20 41     + for Posix A
0550: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 0a 2a 2a  dvisory Locks.**
0560: 20 20 20 20 20 20 2b 20 66 6f 72 20 6e 6f 2d 6f        + for no-o
0570: 70 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20 20 20 20  p locks.**      
0580: 2b 20 66 6f 72 20 64 6f 74 2d 66 69 6c 65 20 6c  + for dot-file l
0590: 6f 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66  ocks.**      + f
05a0: 6f 72 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  or flock() locki
05b0: 6e 67 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72  ng.**      + for
05c0: 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
05d0: 20 6c 6f 63 6b 73 20 28 56 78 57 6f 72 6b 73 20   locks (VxWorks 
05e0: 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 20 20 2b 20  only).**      + 
05f0: 66 6f 72 20 41 46 50 20 66 69 6c 65 73 79 73 74  for AFP filesyst
0600: 65 6d 20 6c 6f 63 6b 73 20 28 4d 61 63 4f 53 58  em locks (MacOSX
0610: 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 20 20 2b   only).**      +
0620: 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 73   for proxy locks
0630: 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a   (MacOSX only).*
0640: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66  *   *  sqlite3_f
0650: 69 6c 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20  ile methods not 
0660: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0670: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20  locking..**   * 
0680: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   Definitions of 
0690: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
06a0: 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  ds objects for a
06b0: 6c 6c 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  ll locking.**   
06c0: 20 20 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20     methods plus 
06d0: 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
06e0: 6e 73 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b  ns for each lock
06f0: 69 6e 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20  ing method..**  
0700: 20 2a 20 20 56 46 53 20 6d 65 74 68 6f 64 20 69   *  VFS method i
0710: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
0720: 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69 74 69  **   *  Definiti
0730: 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  ons of sqlite3_v
0740: 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  fs objects for a
0750: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ll locking metho
0760: 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75 73 20  ds.**      plus 
0770: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
0780: 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  of sqlite3_os_in
0790: 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  it() and sqlite3
07a0: 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a  _os_end()..**.**
07b0: 20 24 49 64 3a 20 6f 73 5f 75 6e 69 78 2e 63 2c   $Id: os_unix.c,
07c0: 76 20 31 2e 32 32 34 20 32 30 30 38 2f 31 31 2f  v 1.224 2008/11/
07d0: 32 39 20 30 32 3a 32 30 3a 32 37 20 64 72 68 20  29 02:20:27 drh 
07e0: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
07f0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0800: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
0810: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0820: 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 20  /* This file is 
0830: 75 73 65 64 20 6f 6e 20 75 6e 69 78 20 6f 6e 6c  used on unix onl
0840: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y */../*.** This
0850: 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
0860: 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
0870: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 3a   locking styles:
0880: 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49  .**.**   1. POSI
0890: 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64  X locking (the d
08a0: 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e  efault),.**   2.
08b0: 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20   No locking,.** 
08c0: 20 20 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f    3. Dot-file lo
08d0: 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66  cking,.**   4. f
08e0: 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a  lock() locking,.
08f0: 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b  **   5. AFP lock
0900: 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a  ing (OSX only),.
0910: 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f  **   6. Named PO
0920: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28  SIX semaphores (
0930: 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a  VXWorks only),.*
0940: 2a 20 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63  *   7. proxy loc
0950: 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29  king. (OSX only)
0960: 0a 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c  .**.** Styles 4,
0970: 20 35 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e   5, and 7 are on
0980: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20  ly available of 
0990: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
09a0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69  CKING_STYLE.** i
09b0: 73 20 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20  s defined to 1. 
09c0: 20 54 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   The SQLITE_ENAB
09d0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
09e0: 20 61 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75   also enables au
09f0: 74 6f 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63  tomatic.** selec
0a00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72  tion of the appr
0a10: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
0a20: 73 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  style based on t
0a30: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a  he filesystem.**
0a40: 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62   where the datab
0a50: 61 73 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20  ase is located. 
0a60: 20 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65   .*/.#if !define
0a70: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
0a80: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
0a90: 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44    if defined(__D
0aa0: 41 52 57 49 4e 5f 5f 29 0a 23 20 20 20 20 64 65  ARWIN__).#    de
0ab0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
0ac0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0ad0: 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   1.#  else.#    
0ae0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
0af0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0b00: 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65  LE 0.#  endif.#e
0b10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
0b20: 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b  ne the OS_VXWORK
0b30: 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20  S pre-processor 
0b40: 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20 62 75  macro to 1 if bu
0b50: 69 6c 64 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78  ilding on .** vx
0b60: 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65  works, or 0 othe
0b70: 72 77 69 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rwise..*/.#ifnde
0b80: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20  f OS_VXWORKS.#  
0b90: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  if defined(__RTP
0ba0: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
0bb0: 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20  WRS_KERNEL).#   
0bc0: 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52   define OS_VXWOR
0bd0: 4b 53 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  KS 1.#  else.#  
0be0: 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f    define OS_VXWO
0bf0: 52 4b 53 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  RKS 0.#  endif.#
0c00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0c10: 73 65 20 23 64 65 66 69 6e 65 73 20 73 68 6f 75  se #defines shou
0c20: 6c 64 20 65 6e 61 62 6c 65 20 3e 32 47 42 20 66  ld enable >2GB f
0c30: 69 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e 20 50  ile support on P
0c40: 6f 73 69 78 20 69 66 20 74 68 65 0a 2a 2a 20 75  osix if the.** u
0c50: 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
0c60: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
0c70: 72 74 73 20 69 74 2e 20 20 49 66 20 74 68 65 20  rts it.  If the 
0c80: 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67  OS lacks.** larg
0c90: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 2c 20  e file support, 
0ca0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65 20  these should be 
0cb0: 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61  no-ops..**.** La
0cc0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
0cd0: 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64   can be disabled
0ce0: 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53 51 4c   using the -DSQL
0cf0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
0d00: 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65  switch.** on the
0d10: 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e   compiler comman
0d20: 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20 69 73  d line.  This is
0d30: 20 6e 65 63 65 73 73 61 72 79 20 69 66 20 79 6f   necessary if yo
0d40: 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a  u are compiling.
0d50: 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d  ** on a recent m
0d60: 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48  achine (ex: RedH
0d70: 61 74 20 37 2e 32 29 20 62 75 74 20 79 6f 75 20  at 7.2) but you 
0d80: 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65 20 74  want your code t
0d90: 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20  o work.** on an 
0da0: 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20 28 65  older machine (e
0db0: 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29 2e 20  x: RedHat 6.0). 
0dc0: 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20   If you compile 
0dd0: 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a  on RedHat 7.2.**
0de0: 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 6f 70   without this op
0df0: 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61  tion, LFS is ena
0e00: 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20 64 6f  ble.  But LFS do
0e10: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20  es not exist in 
0e20: 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e  the kernel.** in
0e30: 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73 6f 20   RedHat 6.0, so 
0e40: 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20 77  the code won't w
0e50: 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72  ork.  Hence, for
0e60: 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a   maximum binary.
0e70: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 79  ** portability y
0e80: 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c  ou should omit L
0e90: 46 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  FS..**.** The pr
0ea0: 65 76 69 6f 75 73 20 70 61 72 61 67 72 61 70 68  evious paragraph
0eb0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 20   was written in 
0ec0: 32 30 30 35 2e 20 20 28 54 68 69 73 20 70 61 72  2005.  (This par
0ed0: 61 67 72 61 70 68 20 69 73 20 77 72 69 74 74 65  agraph is writte
0ee0: 6e 0a 2a 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d  n.** on 2008-11-
0ef0: 32 38 2e 29 20 54 68 65 73 65 20 64 61 79 73 2c  28.) These days,
0f00: 20 61 6c 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65   all Linux kerne
0f10: 6c 73 20 73 75 70 70 6f 72 74 20 6c 61 72 67 65  ls support large
0f20: 20 66 69 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f   files, so.** yo
0f30: 75 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  u should probabl
0f40: 79 20 6c 65 61 76 65 20 4c 46 53 20 65 6e 61 62  y leave LFS enab
0f50: 6c 65 64 2e 20 20 42 75 74 20 73 6f 6d 65 20 65  led.  But some e
0f60: 6d 62 65 64 64 65 64 20 70 6c 61 74 66 6f 72 6d  mbedded platform
0f70: 73 20 6d 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20  s might.** lack 
0f80: 4c 46 53 20 69 6e 20 77 68 69 63 68 20 63 61 73  LFS in which cas
0f90: 65 20 74 68 65 20 53 51 4c 49 54 45 5f 44 49 53  e the SQLITE_DIS
0fa0: 41 42 4c 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d  ABLE_LFS macro m
0fb0: 69 67 68 74 20 73 74 69 6c 6c 20 62 65 20 75 73  ight still be us
0fc0: 65 66 75 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  eful..*/.#ifndef
0fd0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
0fe0: 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41  LFS.# define _LA
0ff0: 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20 20 31  RGE_FILE       1
1000: 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f  .# ifndef _FILE_
1010: 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20 20 20  OFFSET_BITS.#   
1020: 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46  define _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20 65 6e  SET_BITS 64.# en
1040: 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41  dif.# define _LA
1050: 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45 20 31  RGEFILE_SOURCE 1
1060: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73  .#endif../*.** s
1070: 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65 20  tandard include 
1080: 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  files..*/.#inclu
1090: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
10a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
10b0: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
10c0: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75  <fcntl.h>.#inclu
10d0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
10e0: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
10f0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
1100: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
1110: 65 72 72 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53 51  errno.h>..#if SQ
1120: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1130: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
1140: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
1150: 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  >.# if OS_VXWORK
1160: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1170: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
1180: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
1190: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
11a0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
11b0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
11c0: 70 61 72 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c  param.h>.#  incl
11d0: 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68  ude <sys/mount.h
11e0: 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  >.# endif.#endif
11f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1200: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1210: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  */../*.** If we 
1220: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
1230: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
1240: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
1250: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
1260: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
1270: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
1280: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
1290: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
12a0: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
12b0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
12c0: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
12d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
12e0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
12f0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
1300: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
1310: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1320: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1330: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1340: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1350: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1360: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a  4.#endif../*. **
1370: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
1380: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
1390: 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69  ng auto proxy di
13a0: 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r. */.#ifndef SQ
13b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
13c0: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
13d0: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
13e0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
13f0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
1400: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
1410: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1420: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
1450: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
1460: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
1470: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1480: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1490: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
14a0: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
14b0: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
14c0: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
14d0: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
14e0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
14f0: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
1500: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
1510: 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a  E_BUSY)).../*.**
1520: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1530: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1540: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1550: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1560: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1570: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1580: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1590: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
15a0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
15b0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
15c0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
15d0: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
15e0: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
15f0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72  t entry */.  str
1600: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
1610: 2a 70 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a  *pOpen;       /*
1620: 20 49 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20   Info about all 
1630: 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69  open fd's on thi
1640: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72  s inode */.  str
1650: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
1660: 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a   *pLock;      /*
1670: 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b   Info about lock
1680: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
1690: 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
16d0: 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20    int dirfd;    
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1700: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
1710: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73  rectory */.  uns
1720: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
1730: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
1740: 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   The type of loc
1750: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  k held on this f
1760: 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45  d */.  int lastE
1770: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1780: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1790: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  nix errno from t
17a0: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
17b0: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
17c0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69          /* Locki
17e0: 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng style specifi
17f0: 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  c state */.  int
1800: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1820: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1830: 66 69 65 64 20 61 74 20 6f 70 65 6e 20 2a 2f 0a  fied at open */.
1840: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
1850: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
1860: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74  (__linux__).  pt
1870: 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20  hread_t tid;    
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1890: 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68 61  * The thread tha
18a0: 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e  t "owns" this un
18b0: 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  ixFile */.#endif
18c0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
18d0: 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20    int isDelete; 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20     /* Delete on 
1900: 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f  close if true */
1910: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
1920: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20  sFileId *pId;   
1930: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
1940: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
1950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1960: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
1970: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
1980: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
1990: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
19a0: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
19b0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
19c0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
19d0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
19e0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
19f0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
1a00: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
1a10: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
1a20: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
1a30: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
1a40: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
1a50: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
1a60: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
1a70: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
1a80: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
1a90: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
1aa0: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
1ab0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
1ac0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
1ad0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1ae0: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
1af0: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
1b00: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
1b10: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
1b20: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
1b30: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
1b40: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
1b50: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
1b60: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
1b70: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
1b80: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
1b90: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
1ba0: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
1bb0: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
1bc0: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
1bd0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
1be0: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
1bf0: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
1c00: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
1c10: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
1c20: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
1c30: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
1c40: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
1c50: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
1c60: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
1c70: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
1c80: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
1c90: 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74  __.# define fcnt
1ca0: 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69  l(A,B,C) 0.#endi
1cb0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
1cc0: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
1cd0: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
1ce0: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
1cf0: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
1d00: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
1d10: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
1d20: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
1d30: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
1d40: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
1d50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
1d60: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
1d70: 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  .../*.** Helper 
1d80: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
1d90: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
1da0: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
1db0: 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tex..*/.static v
1dc0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
1dd0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
1de0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1df0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1e00: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1e10: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
1e20: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
1e30: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
1e40: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1e50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1e60: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1e70: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1e80: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 0a 23 69  MASTER));.}...#i
1e90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ea0: 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  G./*.** Helper f
1eb0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
1ec0: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
1ed0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1ee0: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
1ef0: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
1f00: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
1f10: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
1f20: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
1f30: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
1f40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
1f50: 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70  st char *locktyp
1f60: 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79  eName(int lockty
1f70: 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c  pe){.  switch( l
1f80: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73  ocktype ){.  cas
1f90: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
1fa0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65  n "NONE";.  case
1fb0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
1fc0: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
1fd0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
1fe0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
1ff0: 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50  ERVED";.  case P
2000: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
2010: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
2020: 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f   case EXCLUSIVE_
2030: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58  LOCK: return "EX
2040: 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20  CLUSIVE";.  }.  
2050: 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a  return "ERROR";.
2060: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2070: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
2080: 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f  CE./*.** Print o
2090: 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ut information a
20a0: 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  bout all locking
20b0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
20c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20d0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75  is used for trou
20e0: 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b  bleshooting lock
20f0: 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64  s on multithread
2100: 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e  ed.** platforms.
2110: 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70    Enable by comp
2120: 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d  iling with the -
2130: 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41  DSQLITE_LOCK_TRA
2140: 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69  CE.** command-li
2150: 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65  ne option on the
2160: 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73   compiler.  This
2170: 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c   code is normall
2180: 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e  y.** turned off.
2190: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
21a0: 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c  ockTrace(int fd,
21b0: 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20   int op, struct 
21c0: 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61  flock *p){.  cha
21d0: 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79  r *zOpName, *zTy
21e0: 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69  pe;.  int s;.  i
21f0: 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20  nt savedErrno;. 
2200: 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b   if( op==F_GETLK
2210: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
2220: 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "GETLK";.  }el
2230: 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54  se if( op==F_SET
2240: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
2250: 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d  e = "SETLK";.  }
2260: 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63  else{.    s = fc
2270: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2280: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2290: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
22a0: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
22b0: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
22c0: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
22d0: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
22e0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
22f0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
2300: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
2310: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
2320: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2330: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
2340: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2350: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
2360: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
2370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2380: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
2390: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
23a0: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
23b0: 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c  .  s = fcntl(fd,
23c0: 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64   op, p);.  saved
23d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
23e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23f0: 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64  ntf("fcntl %d %d
2400: 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20   %s %s %d %d %d 
2410: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65  %d\n",.     thre
2420: 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d  adid, fd, zOpNam
2430: 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70  e, zType, (int)p
2440: 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  ->l_start, (int)
2450: 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28  p->l_len,.     (
2460: 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29  int)p->l_pid, s)
2470: 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20  ;.  if( s==(-1) 
2480: 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26  && op==F_SETLK &
2490: 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  & (p->l_type==F_
24a0: 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79  RDLCK || p->l_ty
24b0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a  pe==F_WRLCK) ){.
24c0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
24d0: 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70   l2;.    l2 = *p
24e0: 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20  ;.    fcntl(fd, 
24f0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
2500: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
2510: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
2520: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
2530: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
2540: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
2550: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
2560: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
2570: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
2580: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
2590: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
25a0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
25b0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
25c0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
25d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25e0: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
25f0: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
2600: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
2610: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
2620: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
2630: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
2640: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
2650: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
2660: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
2670: 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20  }.#define fcntl 
2680: 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66  lockTrace.#endif
2690: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f   /* SQLITE_LOCK_
26a0: 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a  TRACE */..../*.*
26b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
26c0: 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e  ranslates a stan
26d0: 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f  dard POSIX errno
26e0: 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74   code into somet
26f0: 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74  hing.** useful t
2700: 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66  o the clients of
2710: 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e   the sqlite3 fun
2720: 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69  ctions.  Specifi
2730: 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20  cally, it is.** 
2740: 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e  intended to tran
2750: 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20  slate a variety 
2760: 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65  of "try again" e
2770: 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54  rrors into SQLIT
2780: 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20  E_BUSY.** and a 
2790: 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61  variety of "plea
27a0: 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  se close the fil
27b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57  e descriptor NOW
27c0: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a  " errors into .*
27d0: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a  * SQLITE_IOERR.*
27e0: 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72  * .** Errors dur
27f0: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
2800: 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20  on of locks, or 
2810: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
2820: 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a  ort for locks,.*
2830: 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20  * should handle 
2840: 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c  ENOLCK, ENOTSUP,
2850: 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61   EOPNOTSUPP sepa
2860: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
2870: 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f  c int sqliteErro
2880: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
2890: 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20  int posixError, 
28a0: 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29  int sqliteIOErr)
28b0: 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73   {.  switch (pos
28c0: 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73  ixError) {.  cas
28d0: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
28e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28f0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
2900: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
2910: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
2920: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
2930: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
2940: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
2950: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
2960: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
2970: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
2980: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
2990: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
29a0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
29b0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
29c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
29d0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
29e0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
29f0: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
2a00: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
2a10: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
2a20: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
2a30: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
2a40: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
2a50: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
2a60: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09  OERR_LOCK) || ..
2a70: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
2a80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
2a90: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
2aa0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
2ab0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
2ac0: 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20  |..(sqliteIOErr 
2ad0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
2ae0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
2af0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  K) ){.      retu
2b00: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
2b10: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73      }.    /* els
2b20: 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  e fall through *
2b30: 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20  /.  case EPERM: 
2b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b50: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
2b60: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
2b70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b80: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
2b90: 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55     .#if EOPNOTSU
2ba0: 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61  PP!=ENOTSUP.  ca
2bb0: 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a  se EOPNOTSUPP: .
2bc0: 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67      /* something
2bd0: 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61   went terribly a
2be0: 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  wry, unless duri
2bf0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
2c00: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
2c10: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
2c20: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
2c30: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
2c40: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
2c50: 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20  #ifdef ENOTSUP. 
2c60: 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a   case ENOTSUP: .
2c70: 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66      /* invalid f
2c80: 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  d, unless during
2c90: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
2ca0: 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69  port introspecti
2cb0: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20  on, in which .  
2cc0: 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79     * it actually
2cd0: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
2ce0: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ays */.#endif.  
2cf0: 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65  case EIO:.  case
2d00: 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45   EBADF:.  case E
2d10: 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e  INVAL:.  case EN
2d20: 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45  OTCONN:.  case E
2d30: 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e  NODEV:.  case EN
2d40: 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45  XIO:.  case ENOE
2d50: 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c  NT:.  case ESTAL
2d60: 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53  E:.  case ENOSYS
2d70: 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73  :.    /* these s
2d80: 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20  hould force the 
2d90: 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20  client to close 
2da0: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63  the file and rec
2db0: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20  onnect */.    . 
2dc0: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
2dd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
2de0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a  r;.  }.}..../***
2df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
2e50: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
2e60: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
2e70: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
2e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
2e90: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
2ea0: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
2eb0: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
2ec0: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
2ed0: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
2ee0: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
2ef0: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
2f00: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
2f10: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
2f20: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
2f30: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
2f40: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
2f50: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
2f60: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
2f70: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
2f80: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2f90: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2fa0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2fb0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
2fc0: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
2fd0: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
2fe0: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
2ff0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
3000: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
3010: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
3020: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
3030: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
3040: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
3050: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
3060: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
3070: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
3080: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
3090: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
30a0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
30b0: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
30c0: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
30d0: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
30e0: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
30f0: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
3100: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
3110: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
3120: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
3130: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
3140: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
3150: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
3160: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
3170: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
3180: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
3190: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
31a0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
31b0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31d0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
31e0: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
31f0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
3220: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
3230: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
3240: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
3250: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
3260: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
3270: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
3280: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
3290: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
32a0: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
32b0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
32c0: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
32d0: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
32e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
32f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
3300: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
3310: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
3320: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
3330: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
3340: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
3350: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
3360: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
3370: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
3380: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
3390: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
33a0: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
33b0: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
33c0: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
33d0: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
33e0: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
33f0: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
3400: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
3410: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
3420: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
3430: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
3440: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
3450: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
3460: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
3470: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
3480: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
3490: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
34a0: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
34b0: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
34c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
34d0: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
34e0: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
34f0: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
3500: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
3510: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
3520: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
3530: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
3540: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3550: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
3560: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
3570: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
3580: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
3590: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
35a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35b0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
35c0: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
35d0: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
35e0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
35f0: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
3600: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
3610: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
3620: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
3630: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
3640: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
3650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3660: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
3670: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
3680: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
3690: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
36a0: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
36b0: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
36c0: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
36d0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
36e0: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
36f0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
3700: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
3710: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
3720: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
3730: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
3740: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
3750: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
3760: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
3770: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
3780: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
3790: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
37a0: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
37b0: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
37c0: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
37d0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
37e0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
37f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3800: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
3810: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
3820: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3830: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
3840: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
3850: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
3860: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
3870: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
3880: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
3890: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
38a0: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
38b0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
38c0: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
38d0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
38e0: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
38f0: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
3900: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
3930: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
3940: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
3950: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
3960: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 73  =='/' );.  n = s
3970: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
3980: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
3990: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
39a0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
39b0: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
39c0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
39d0: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
39e0: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
39f0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
3a00: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
3a10: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
3a20: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
3a30: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
3a40: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
3a50: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
3a60: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
3a70: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
3a80: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
3a90: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
3aa0: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
3ab0: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
3ac0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
3ad0: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
3ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
3af0: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
3b00: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
3b10: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
3b20: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
3b30: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
3b40: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
3b50: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
3b60: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
3b70: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
3b80: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
3b90: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
3ba0: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
3bb0: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
3bc0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
3bd0: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
3be0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3bf0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
3c00: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
3c10: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
3c20: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
3c30: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
3c40: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
3c50: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
3c60: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
3c70: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
3c80: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
3c90: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
3ca0: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
3cb0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
3cc0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
3cd0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
3ce0: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
3cf0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
3d00: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3d10: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
3d20: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3d30: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
3d40: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
3d50: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
3d60: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
3d70: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
3d80: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
3d90: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
3da0: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
3db0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3dc0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
3dd0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
3de0: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
3df0: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
3e00: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
3e10: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
3e20: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
3e30: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
3e40: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
3e50: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
3e60: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
3e70: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
3e80: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
3e90: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
3ea0: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
3eb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
3ec0: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
3ed0: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
3ee0: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
3ef0: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
3f00: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
3f10: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
3f20: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
3f30: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
3f40: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f90: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fe0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
3ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4000: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
4010: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
4020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4030: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
4040: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
4050: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
4060: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
4070: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
4080: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
4090: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
40a0: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
40b0: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
40c0: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
40d0: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
40e0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
40f0: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
4100: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
4110: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
4120: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
4130: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
4140: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
4150: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
4160: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
4170: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
4180: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
4190: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
41a0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
41b0: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
41c0: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
41d0: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
41e0: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
41f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
4200: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
4210: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
4220: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
4230: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
4240: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
4250: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
4260: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
4270: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
4280: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
4290: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
42a0: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
42b0: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
42c0: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
42d0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
42e0: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
42f0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
4300: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
4310: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
4320: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
4330: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
4340: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
4350: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
4360: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
4370: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
4380: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
4390: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
43a0: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
43b0: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
43c0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
43d0: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
43e0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
43f0: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
4400: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
4410: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
4420: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
4430: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
4440: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
4450: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
4460: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
4470: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
4480: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
4490: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
44a0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
44b0: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
44c0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
44d0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
44e0: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
44f0: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
4500: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
4510: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
4520: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
4530: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
4540: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
4550: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
4560: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
4570: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
4580: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
4590: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
45a0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
45b0: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
45c0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
45d0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
4600: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
4610: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
4620: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
4630: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
4640: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
4650: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
4660: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
4670: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
4680: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
4690: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
46a0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
46b0: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
46c0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
46d0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
46e0: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
46f0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
4700: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
4710: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
4720: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
4730: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
4740: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
4750: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
4760: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
4770: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
4780: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
4790: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
47a0: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
47b0: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
47c0: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
47d0: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
47e0: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
47f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
4800: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
4810: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
4820: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
4830: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
4840: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
4850: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
4860: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
4870: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
4880: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
4890: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
48a0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
48b0: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
48c0: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
48d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
48e0: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
48f0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
4900: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
4910: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
4920: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
4930: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
4940: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
4950: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
4960: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
4970: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
4980: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
4990: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
49a0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
49b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
49c0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
49d0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
49e0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
49f0: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
4a00: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
4a10: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
4a20: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
4a30: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
4a40: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
4a50: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
4a60: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
4a70: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
4a80: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
4a90: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
4aa0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
4ab0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
4ac0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
4ad0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
4ae0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
4af0: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
4b00: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
4b10: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
4b20: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
4b30: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
4b40: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
4b50: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
4b60: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
4b70: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
4b80: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
4b90: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
4ba0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
4bb0: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
4bc0: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
4bd0: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
4be0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
4bf0: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
4c00: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
4c10: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
4c20: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
4c30: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
4c40: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
4c50: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
4c60: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
4c70: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
4c80: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
4c90: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
4ca0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
4cb0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20 73   each unixFile s
4cc0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
4cd0: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
4ce0: 6f 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e 74  o an unixOpenCnt
4cf0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
4d00: 72 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f 70  re is one unixOp
4d10: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a  enCnt structure.
4d20: 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64  ** per open inod
4d30: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  e, which means t
4d40: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69  hat multiple uni
4d50: 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20  xFile can point 
4d60: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 75  to a single.** u
4d70: 6e 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68 65  nixOpenCnt.  Whe
4d80: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
4d90: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
4da0: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
4db0: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
4dc0: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
4dd0: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
4de0: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
4df0: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
4e00: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
4e10: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
4e20: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
4e30: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
4e40: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
4e50: 20 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74   The unixOpenCnt
4e60: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
4e70: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
4e80: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
4e90: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
4ea0: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
4eb0: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
4ec0: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
4ed0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
4ee0: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
4ef0: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
4f00: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
4f10: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
4f20: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
4f30: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
4f40: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
4f50: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
4f60: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
4f70: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
4f80: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
4f90: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
4fa0: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
4fb0: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
4fc0: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
4fd0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
4fe0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
4ff0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
5000: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
5010: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
5020: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
5030: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
5040: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
5050: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
5060: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
5070: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
5080: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
5090: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
50a0: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
50b0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
50c0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
50d0: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
50e0: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
50f0: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
5100: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
5110: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
5120: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
5130: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
5140: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
5150: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
5160: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
5170: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
5180: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5190: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
51a0: 2e 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20  ..** We have to 
51b0: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
51c0: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
51d0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
51e0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
51f0: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  rocess..**.** On
5200: 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 74   systems where t
5210: 68 72 65 61 64 20 41 20 69 73 20 75 6e 61 62 6c  hread A is unabl
5220: 65 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63 6b  e to modify lock
5230: 73 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  s created by.** 
5240: 74 68 72 65 61 64 20 42 2c 20 77 65 20 68 61 76  thread B, we hav
5250: 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20  e to keep track 
5260: 6f 66 20 77 68 69 63 68 20 74 68 72 65 61 64 20  of which thread 
5270: 63 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a 20  created each.** 
5280: 6c 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68 65  lock.  Hence the
5290: 72 65 20 69 73 20 61 6e 20 65 78 74 72 61 20 66  re is an extra f
52a0: 69 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79 20  ield in the key 
52b0: 74 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49  to the unixLockI
52c0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
52d0: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73 20   to record this 
52e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41 6e  information.  An
52f0: 64 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65  d on those syste
5300: 6d 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c 65  ms it.** is ille
5310: 67 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20 74  gal to begin a t
5320: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e  ransaction in on
5330: 65 20 74 68 72 65 61 64 20 61 6e 64 20 66 69 6e  e thread and fin
5340: 69 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f  ish it.** in ano
5350: 74 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73 20  ther.  For this 
5360: 6c 61 74 74 65 72 20 72 65 73 74 72 69 63 74 69  latter restricti
5370: 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  on, there is no 
5380: 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20  work-around..** 
5390: 49 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74 69  It is a limitati
53a0: 6f 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65 61  on of LinuxThrea
53b0: 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  ds..*/../*.** Se
53c0: 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75  t or check the u
53d0: 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c  nixFile.tid fiel
53e0: 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69  d.  This field i
53f0: 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e  s set when an un
5400: 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72  ixFile.** is fir
5410: 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20  st opened.  All 
5420: 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20  subsequent uses 
5430: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
5440: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a  verify that the.
5450: 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69  ** same thread i
5460: 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74  s operating on t
5470: 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f  he unixFile.  So
5480: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
5490: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
54a0: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
54b0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
54c0: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
54d0: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
54e0: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
54f0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
5500: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
5510: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
5520: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
5530: 61 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c 6f  another while lo
5540: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a 2a  cks are held..**
5550: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
5560: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
5570: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65   unixFile can be
5580: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20   moved from one 
5590: 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f  thread to.** ano
55a0: 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20  ther as long as 
55b0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
55c0: 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20  n a system that 
55d0: 73 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73  supports threads
55e0: 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65  .** overriding e
55f0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
5600: 20 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20 74   (which is now t
5610: 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62  he most common b
5620: 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69  ehavior).** or i
5630: 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68  f no locks are h
5640: 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e  eld.  But the un
5650: 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65  ixFile.pLock fie
5660: 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a  ld needs to be.*
5670: 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63  * recomputed bec
5680: 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63  ause its key inc
5690: 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64  ludes the thread
56a0: 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a  -id.  See the .*
56b0: 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  * transferOwners
56c0: 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  hip() function b
56d0: 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f  elow for additio
56e0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  nal information.
56f0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
5700: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
5710: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
5720: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
5730: 41 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74  ADID(X)   (X)->t
5740: 69 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  id = pthread_sel
5750: 66 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  f().# define CHE
5760: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28  CK_THREADID(X) (
5770: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
5780: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d  achOthersLocks==
5790: 30 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20  0 && \.         
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61     !pthread_equa
57c0: 6c 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72  l((X)->tid, pthr
57d0: 65 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c  ead_self())).#el
57e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f  se.# define SET_
57f0: 54 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65  THREADID(X).# de
5800: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
5810: 44 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a  DID(X) 0.#endif.
5820: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
5830: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
5840: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
5850: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
5860: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
5870: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
5880: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
5890: 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69  ture given its i
58a0: 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69  node.  This.** i
58b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
58c0: 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65 78  e unixLockKey ex
58d0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68  cept that the th
58e0: 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74  read ID is omitt
58f0: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ed..*/.struct un
5900: 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76  ixFileId {.  dev
5910: 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20  _t dev;         
5920: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
5930: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  ce number */.#if
5940: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
5950: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5960: 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69  Id *pId;  /* Uni
5970: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
5980: 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73  vxworks. */.#els
5990: 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  e.  ino_t ino;  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
59c0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
59d0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
59e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
59f0: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
5a00: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
5a10: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
5a20: 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78   particular unix
5a30: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
5a40: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
5a50: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72  de..**.** If thr
5a60: 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72  eads cannot over
5a70: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
5a80: 20 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68 72   locks (LinuxThr
5a90: 65 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a 2a  eads), then we.*
5aa0: 2a 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c 6f  * set the unixLo
5ab0: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
5ac0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
5ad0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
5ae0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
5af0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5b00: 28 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c 29  (Posix and NPTL)
5b10: 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77   then tid is alw
5b20: 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
5b30: 0a 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74 74  .** tid is omitt
5b40: 65 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ed if we compile
5b50: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
5b60: 6e 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f 6e  ng support or on
5b70: 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72 20   an OS.** other 
5b80: 74 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73  than linux..*/.s
5b90: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65  truct unixLockKe
5ba0: 79 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  y {.  struct uni
5bb0: 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f 2a  xFileId fid;  /*
5bc0: 20 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69   Unique identifi
5bd0: 65 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  er for the file 
5be0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
5bf0: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
5c00: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
5c10: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
5c20: 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 66   /* Thread ID of
5c30: 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65 72   lock owner. Zer
5c40: 6f 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 4c  o if not using L
5c50: 69 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a 23  inuxThreads */.#
5c60: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5c70: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5c80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5c90: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
5ca0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
5cb0: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
5cc0: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
5cd0: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
5ce0: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
5cf0: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
5d00: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
5d10: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
5d20: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
5d30: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
5d40: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
5d50: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
5d60: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
5d70: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
5d80: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
5d90: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
5da0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
5db0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
5dc0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
5dd0: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
5de0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
5df0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63  /.struct unixLoc
5e00: 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  kInfo {.  struct
5e10: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63   unixLockKey loc
5e20: 6b 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  kKey;     /* The
5e30: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
5e40: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
5e70: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
5e80: 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70  */.  int locktyp
5e90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5ea0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
5eb0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
5ec0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
5ed0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5f00: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
5f10: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
5f20: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
5f30: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
5f40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
5f50: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a  unixLockInfo obj
5f60: 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ects */.  struct
5f70: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
5f80: 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20  Prev;     /*    
5f90: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
5fa0: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ed */.};../*.** 
5fb0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5fc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5fd0: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
5fe0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
5ff0: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69  n.** inode.  Thi
6000: 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  s structure keep
6010: 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e  s track of the n
6020: 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f  umber of locks o
6030: 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e  n that.** inode.
6040: 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20    If a close is 
6050: 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73  attempted agains
6060: 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20  t an inode that 
6070: 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f  is holding.** lo
6080: 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69  cks, the close i
6090: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
60a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72   all locks clear
60b0: 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a   by adding the.*
60c0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
60d0: 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74  r to be closed t
60e0: 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69  o the pending li
60f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  st..**.** TODO: 
6100: 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69   Consider changi
6110: 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61 74 20  ng this so that 
6120: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
6130: 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64  single file.** d
6140: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61  escriptor for ea
6150: 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76  ch open file, ev
6160: 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70  en when it is op
6170: 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ened multiple ti
6180: 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73  mes..** The clos
6190: 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e() system call 
61a0: 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72  would only occur
61b0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64   when the last d
61c0: 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67  atabase.** using
61d0: 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73   the file closes
61e0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
61f0: 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75  OpenCnt {.  stru
6200: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6210: 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c  leId;   /* The l
6220: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
6230: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
6240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6250: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
6260: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
6270: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  re */.  int nLoc
6280: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
6290: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
62a0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
62b0: 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e  ks */.  int nPen
62c0: 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  ding;           
62d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
62e0: 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29   pending close()
62f0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
6300: 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20   int *aPending; 
6310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
6320: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c  lloced space hol
6330: 64 69 6e 67 20 66 64 27 73 20 61 77 61 69 74 69  ding fd's awaiti
6340: 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a  ng a close() */.
6350: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
6360: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
63a0: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
63b0: 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
63c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
63d0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63e0: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 75 6e  ndif.  struct un
63f0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74  ixOpenCnt *pNext
6400: 2c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  , *pPrev;   /* L
6410: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4f  ist of all unixO
6420: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 20 2a  penCnt objects *
6430: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74  /.};../*.** List
6440: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63  s of all unixLoc
6450: 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70  kInfo and unixOp
6460: 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 2e 20 20  enCnt objects.  
6470: 54 68 65 73 65 20 75 73 65 64 20 74 6f 20 62 65  These used to be
6480: 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65 73 2e   hash.** tables.
6490: 20 20 42 75 74 20 74 68 65 20 6e 75 6d 62 65 72    But the number
64a0: 20 6f 66 20 6f 62 6a 65 63 74 73 20 69 73 20 72   of objects is r
64b0: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
64c0: 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20 6e  a dozen and.** n
64d0: 65 76 65 72 20 65 78 63 65 65 64 73 20 61 20 66  ever exceeds a f
64e0: 65 77 20 74 68 6f 75 73 61 6e 64 2e 20 20 41 6e  ew thousand.  An
64f0: 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f 74 20  d lookup is not 
6500: 6f 6e 20 61 20 63 72 69 74 69 63 61 6c 0a 2a 2a  on a critical.**
6510: 20 70 61 74 68 20 73 6f 20 61 20 73 69 6d 70 6c   path so a simpl
6520: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77 69  e linked list wi
6530: 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a 2f 0a 73  ll suffice..*/.s
6540: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
6550: 78 4c 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c  xLockInfo *lockL
6560: 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ist = 0;.static 
6570: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
6580: 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20 30  nt *openList = 0
6590: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  ;../*.** This va
65a0: 72 69 61 62 6c 65 20 72 65 6d 65 6d 62 65 72 73  riable remembers
65b0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
65c0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
65d0: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
65e0: 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  .** locks..**.**
65f0: 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72      0:  No.  Thr
6600: 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72  eads cannot over
6610: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
6620: 20 6c 6f 63 6b 73 2e 20 20 28 4c 69 6e 75 78 54   locks.  (LinuxT
6630: 68 72 65 61 64 73 29 0a 2a 2a 20 20 20 20 31 3a  hreads).**    1:
6640: 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20    Yes.  Threads 
6650: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
6660: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20  h others locks. 
6670: 20 28 50 6f 73 69 78 20 26 20 4e 4c 50 54 29 0a   (Posix & NLPT).
6680: 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e  **   -1:  We don
6690: 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a  't know yet..**.
66a0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
66b0: 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63  ms, we know at c
66c0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74  ompile-time if t
66d0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
66e0: 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65  ide each.** othe
66f0: 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68  rs locks.  On th
6700: 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ose systems, the
6710: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
6720: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63  VERRIDE_LOCK mac
6730: 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65  ro.** will be se
6740: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  t appropriately.
6750: 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65    On other syste
6760: 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63  ms, we have to c
6770: 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69  heck at.** runti
6780: 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61  me.  On these la
6790: 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51  tter systems, SQ
67a0: 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LTIE_THREAD_OVER
67b0: 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20  RIDE_LOCK is.** 
67c0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
67d0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e   This variable n
67e0: 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65  ormally has file
67f0: 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75   scope only.  Bu
6800: 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  t during testing
6810: 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  , we make.** it 
6820: 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74  a global so that
6830: 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 63   the test code c
6840: 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76 61  an change its va
6850: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
6860: 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74  verify.** that t
6870: 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20 68  he right stuff h
6880: 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72  appens in either
6890: 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   case..*/.#ifnde
68a0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  f SQLITE_THREAD_
68b0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20  OVERRIDE_LOCK.# 
68c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48  define SQLITE_TH
68d0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
68e0: 43 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66  CK -1.#endif.#if
68f0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6900: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
6910: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
6920: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
6930: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
6940: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
6950: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
6960: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6970: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
6980: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
6990: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
69a0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
69b0: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
69c0: 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69  passed into indi
69d0: 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74  vidual test.** t
69e0: 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65  hreads by the te
69f0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
6a00: 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e  ehavior() routin
6a10: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72  e..*/.struct thr
6a20: 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20  eadTestData {.  
6a30: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
6a40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
6a50: 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
6a60: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
6a70: 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ck;     /* The l
6a80: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
6a90: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
6aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6ab0: 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f  Result of the lo
6ac0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
6ad0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54  */.};..#if SQLIT
6ae0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
6af0: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
6b00: 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  _)./*.** This fu
6b10: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
6b20: 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  s the main routi
6b30: 6e 65 20 66 6f 72 20 61 20 74 68 72 65 61 64 20  ne for a thread 
6b40: 6c 61 75 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74  launched by.** t
6b50: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
6b60: 42 65 68 61 76 69 6f 72 28 29 2e 20 49 74 20 74  Behavior(). It t
6b70: 65 73 74 73 20 77 68 65 74 68 65 72 20 74 68 65  ests whether the
6b80: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74   shared-lock obt
6b90: 61 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ained.** by the 
6ba0: 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 20 74  main thread in t
6bb0: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
6bc0: 42 65 68 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c  Behavior() confl
6bd0: 69 63 74 73 20 77 69 74 68 20 61 0a 2a 2a 20 68  icts with a.** h
6be0: 79 70 6f 74 68 65 74 69 63 61 6c 20 77 72 69 74  ypothetical writ
6bf0: 65 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20  e-lock obtained 
6c00: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 6f  by this thread o
6c10: 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
6c20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65  .**.** The write
6c30: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 74  -lock is not act
6c40: 75 61 6c 6c 79 20 61 63 71 75 69 72 65 64 2c 20  ually acquired, 
6c50: 61 73 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  as this is not p
6c60: 6f 73 73 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74  ossible if .** t
6c70: 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20  he file is open 
6c80: 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  in read-only mod
6c90: 65 20 28 73 65 65 20 74 69 63 6b 65 74 20 23 33  e (see ticket #3
6ca0: 34 37 32 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  472)..*/ .static
6cb0: 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63   void *threadLoc
6cc0: 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70  kingTest(void *p
6cd0: 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74  Arg){.  struct t
6ce0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70  hreadTestData *p
6cf0: 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74  Data = (struct t
6d00: 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70  hreadTestData*)p
6d10: 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65  Arg;.  pData->re
6d20: 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61  sult = fcntl(pDa
6d30: 74 61 2d 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ta->fd, F_GETLK,
6d40: 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a   &pData->lock);.
6d50: 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d    return pArg;.}
6d60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6d70: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
6d80: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
6d90: 5f 29 20 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c 49  _) */...#if SQLI
6da0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
6db0: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
6dc0: 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  __)./*.** This p
6dd0: 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70 74  rocedure attempt
6de0: 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  s to determine w
6df0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
6e00: 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65  reads.** can ove
6e10: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6e20: 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74  s locks then set
6e30: 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64  s the .** thread
6e40: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
6e50: 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c  ersLocks variabl
6e60: 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  e appropriately.
6e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6e80: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
6e90: 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64  gBehavior(int fd
6ea0: 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64  _orig){.  int fd
6eb0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  ;.  int rc;.  st
6ec0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
6ed0: 61 74 61 20 64 3b 0a 20 20 73 74 72 75 63 74 20  ata d;.  struct 
6ee0: 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65  flock l;.  pthre
6ef0: 61 64 5f 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20  ad_t t;..  fd = 
6f00: 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20  dup(fd_orig);.  
6f10: 69 66 28 20 66 64 3c 30 20 29 20 72 65 74 75 72  if( fd<0 ) retur
6f20: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20  n;.  memset(&l, 
6f30: 30 2c 20 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20  0, sizeof(l));. 
6f40: 20 6c 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44   l.l_type = F_RD
6f50: 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d  LCK;.  l.l_len =
6f60: 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20   1;.  l.l_start 
6f70: 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63  = 0;.  l.l_whenc
6f80: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
6f90: 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72  rc = fcntl(fd_or
6fa0: 69 67 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29  ig, F_SETLK, &l)
6fb0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20  ;.  if( rc!=0 ) 
6fc0: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
6fd0: 28 26 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  (&d, 0, sizeof(d
6fe0: 29 29 3b 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b  ));.  d.fd = fd;
6ff0: 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20  .  d.lock = l;. 
7000: 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d   d.lock.l_type =
7010: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72   F_WRLCK;.  pthr
7020: 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30  ead_create(&t, 0
7030: 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54  , threadLockingT
7040: 65 73 74 2c 20 26 64 29 3b 0a 20 20 70 74 68 72  est, &d);.  pthr
7050: 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a  ead_join(t, 0);.
7060: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 69    close(fd);.  i
7070: 66 28 20 64 2e 72 65 73 75 6c 74 21 3d 30 20 29  f( d.result!=0 )
7080: 20 72 65 74 75 72 6e 3b 0a 20 20 74 68 72 65 61   return;.  threa
7090: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
70a0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c  hersLocks = (d.l
70b0: 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
70c0: 4c 43 4b 29 3b 0a 7d 0a 23 65 6c 69 66 20 53 51  LCK);.}.#elif SQ
70d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
70e0: 2f 2a 0a 2a 2a 20 4f 6e 20 61 6e 79 74 68 69 6e  /*.** On anythin
70f0: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69 6e  g other than lin
7100: 75 78 2c 20 61 73 73 75 6d 65 20 74 68 72 65 61  ux, assume threa
7110: 64 73 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  ds override each
7120: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
7130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
7140: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
7150: 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f  ehavior(int fd_o
7160: 72 69 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  rig){.  UNUSED_P
7170: 41 52 41 4d 45 54 45 52 28 66 64 5f 6f 72 69 67  ARAMETER(fd_orig
7180: 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72  );.  threadsOver
7190: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
71a0: 63 6b 73 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69  cks = 1;.}.#endi
71b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 45 52  f /* SQLITE_THER
71c0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
71d0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
71e0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
71f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74   unixLockInfo st
7200: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
7210: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
7220: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a  findLockInfo()..
7230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7240: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
7250: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7260: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66  fo *pLock){.  if
7270: 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ( pLock ){.    p
7280: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
7290: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
72a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
72b0: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29  ( pLock->pPrev )
72c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
72d0: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e  ( pLock->pPrev->
72e0: 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pNext==pLock );.
72f0: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
7300: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Prev->pNext = pL
7310: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
7320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7330: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73   assert( lockLis
7340: 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  t==pLock );.    
7350: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
7360: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
7370: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7380: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Lock->pNext ){. 
7390: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
73a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
73b0: 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  ev==pLock );.   
73c0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78       pLock->pNex
73d0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
73e0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
73f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7400: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
7410: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
7420: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65  elease a unixOpe
7430: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70  nCnt structure p
7440: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
7450: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
7460: 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nfo()..*/.static
7470: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65   void releaseOpe
7480: 6e 43 6e 74 28 73 74 72 75 63 74 20 75 6e 69 78  nCnt(struct unix
7490: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b  OpenCnt *pOpen){
74a0: 0a 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a  .  if( pOpen ){.
74b0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d      pOpen->nRef-
74c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e  -;.    if( pOpen
74d0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
74e0: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 50     if( pOpen->pP
74f0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
7500: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 50  ssert( pOpen->pP
7510: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70 65  rev->pNext==pOpe
7520: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  n );.        pOp
7530: 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  en->pPrev->pNext
7540: 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
7550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
7570: 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29 3b  enList==pOpen );
7580: 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 4c 69 73  .        openLis
7590: 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  t = pOpen->pNext
75a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
75b0: 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  if( pOpen->pNext
75c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
75d0: 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  rt( pOpen->pNext
75e0: 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20 29  ->pPrev==pOpen )
75f0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
7600: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
7610: 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20 20  pOpen->pPrev;.  
7620: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7630: 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d 3e  te3_free(pOpen->
7640: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20  aPending);.     
7650: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f   sqlite3_free(pO
7660: 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pen);.    }.  }.
7670: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
7680: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7690: 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63  , locate unixLoc
76a0: 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70  kInfo and unixOp
76b0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
76c0: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
76d0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
76e0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
76f0: 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63   new ones if nec
7700: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
7710: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69  return values mi
7720: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
7730: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
7740: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52   occurs..**.** R
7750: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
7760: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
7770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7780: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 75  indLockInfo(.  u
7790: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77b0: 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20   Unix file with 
77c0: 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69  file desc used i
77d0: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  n the key */.  s
77e0: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
77f0: 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a  fo **ppLock,  /*
7800: 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78   Return the unix
7810: 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  LockInfo structu
7820: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  re here */.  str
7830: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
7840: 2a 2a 70 70 4f 70 65 6e 20 20 20 20 2f 2a 20 52  **ppOpen    /* R
7850: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 4f 70  eturn the unixOp
7860: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
7870: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
7880: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
7890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
78a0: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
78b0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
78c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
78d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
78e0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
78f0: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
7900: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
7910: 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20  Key lockKey;    
7920: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
7930: 72 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  r the unixLockIn
7940: 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  fo structure */.
7950: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
7960: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
7970: 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66   /* Lookup key f
7980: 6f 72 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43  or the unixOpenC
7990: 6e 74 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73  nt struct */.  s
79a0: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
79b0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
79c0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
79d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
79e0: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
79f0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 20  Info *pLock;    
7a00: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
7a10: 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  xLockInfo object
7a20: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
7a30: 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b  xOpenCnt *pOpen;
7a40: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
7a50: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62  e unixOpenCnt ob
7a60: 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  ject */..  /* Ge
7a70: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
7a80: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
7a90: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
7aa0: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
7ab0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
7ac0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
7ad0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
7ae0: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
7af0: 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  fstat(fd, &statb
7b00: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
7b10: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
7b20: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
7b30: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
7b40: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
7b50: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
7b60: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
7b70: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
7b80: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
7b90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
7ba0: 7d 0a 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  }..  /* On OS X 
7bb0: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
7bc0: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
7bd0: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
7be0: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
7bf0: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
7c00: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
7c10: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
7c20: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
7c30: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
7c40: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
7c50: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
7c60: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
7c70: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
7c80: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
7c90: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
7ca0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
7cb0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
7cc0: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
7cd0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
7ce0: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
7cf0: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
7d00: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
7d10: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
7d20: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
7d30: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
7d40: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
7d50: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
7d60: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
7d70: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
7d80: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
7d90: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
7da0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
7db0: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
7dc0: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
7dd0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
7de0: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
7df0: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
7e00: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
7e10: 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77  size==0 ){.    w
7e20: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
7e30: 3b 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  ;.    rc = fstat
7e40: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
7e50: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
7e60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
7e70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
7e80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7e90: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
7ea0: 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28  }.  }..  memset(
7eb0: 26 6c 6f 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a  &lockKey, 0, siz
7ec0: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20  eof(lockKey));. 
7ed0: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76   lockKey.fid.dev
7ee0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
7ef0: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
7f00: 53 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  S.  lockKey.fid.
7f10: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
7f20: 3b 0a 23 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65  ;.#else.  lockKe
7f30: 79 2e 66 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74  y.fid.ino = stat
7f40: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
7f50: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
7f60: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
7f70: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
7f80: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
7f90: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
7fa0: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
7fb0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
7fc0: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
7fd0: 20 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20    lockKey.tid = 
7fe0: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
7ff0: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f  achOthersLocks ?
8000: 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c   0 : pthread_sel
8010: 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69  f();.#endif.  fi
8020: 6c 65 49 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66  leId = lockKey.f
8030: 69 64 3b 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b  id;.  if( ppLock
8040: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  !=0 ){.    pLock
8050: 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20   = lockList;.   
8060: 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26   while( pLock &&
8070: 20 6d 65 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79   memcmp(&lockKey
8080: 2c 20 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65  , &pLock->lockKe
8090: 79 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  y, sizeof(lockKe
80a0: 79 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  y)) ){.      pLo
80b0: 63 6b 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ck = pLock->pNex
80c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
80d0: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
80e0: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
80f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8100: 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20  f(*pLock) );.   
8110: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8120: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8140: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
8150: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
8160: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63      }.      pLoc
8170: 6b 2d 3e 6c 6f 63 6b 4b 65 79 20 3d 20 6c 6f 63  k->lockKey = loc
8180: 6b 4b 65 79 3b 0a 20 20 20 20 20 20 70 4c 6f 63  kKey;.      pLoc
8190: 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  k->nRef = 1;.   
81a0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
81b0: 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  0;.      pLock->
81c0: 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20  locktype = 0;.  
81d0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
81e0: 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20   = lockList;.   
81f0: 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20     pLock->pPrev 
8200: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = 0;.      if( l
8210: 6f 63 6b 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69  ockList ) lockLi
8220: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63  st->pPrev = pLoc
8230: 6b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73  k;.      lockLis
8240: 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d  t = pLock;.    }
8250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63  else{.      pLoc
8260: 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  k->nRef++;.    }
8270: 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70  .    *ppLock = p
8280: 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Lock;.  }.  if( 
8290: 70 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20  ppOpen!=0 ){.   
82a0: 20 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73   pOpen = openLis
82b0: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  t;.    while( pO
82c0: 70 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  pen && memcmp(&f
82d0: 69 6c 65 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66  ileId, &pOpen->f
82e0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
82f0: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 20 20  leId)) ){.      
8300: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70  pOpen = pOpen->p
8310: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
8320: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
8330: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
8340: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
8350: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
8360: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d        if( pOpen=
8370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
8380: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
8390: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
83a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
83b0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
83c0: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
83d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
83e0: 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66  Open->fileId = f
83f0: 69 6c 65 49 64 3b 0a 20 20 20 20 20 20 70 4f 70  ileId;.      pOp
8400: 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  en->nRef = 1;.  
8410: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
8420: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
8430: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
8440: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
8450: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
8460: 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d    pOpen->pNext =
8470: 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20   openList;.     
8480: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 3d 20   pOpen->pPrev = 
8490: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65  0;.      if( ope
84a0: 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73 74  nList ) openList
84b0: 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b  ->pPrev = pOpen;
84c0: 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20  .      openList 
84d0: 3d 20 70 4f 70 65 6e 3b 0a 23 69 66 20 4f 53 5f  = pOpen;.#if OS_
84e0: 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 70 4f  VXWORKS.      pO
84f0: 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 4e 55 4c 4c  pen->pSem = NULL
8500: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
8510: 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
8520: 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  ';.#endif.    }e
8530: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
8540: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
8550: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
8560: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
8570: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
8580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8590: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
85a0: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
85b0: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
85c0: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
85d0: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
85e0: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
85f0: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
8600: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
8610: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
8620: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
8630: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
8640: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
8650: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
8660: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
8670: 65 6d 73 20 74 68 61 74 20 75 73 65 20 4c 69 6e  ems that use Lin
8680: 75 78 54 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  uxThreads..**.**
8690: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
86a0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
86b0: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
86c0: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
86d0: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
86e0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
86f0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
8700: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
8710: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
8720: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
8730: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
8740: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
8750: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
8760: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
8770: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
8780: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74  (__linux__).stat
8790: 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f  ic int transferO
87a0: 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c  wnership(unixFil
87b0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
87c0: 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74   rc;.  pthread_t
87d0: 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68   hSelf;.  if( th
87e0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
87f0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a  hOthersLocks ){.
8800: 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70      /* Ownership
8810: 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e   transfers not n
8820: 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79  eeded on this sy
8830: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75  stem */.    retu
8840: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8850: 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72  }.  hSelf = pthr
8860: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66  ead_self();.  if
8870: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
8880: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
8890: 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  f) ){.    /* We 
88a0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
88b0: 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a   same thread */.
88c0: 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f      OSTRACE1("No
88d0: 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20  -transfer, same 
88e0: 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20  thread\n");.    
88f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8900: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
8910: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
8920: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57  LOCK ){.    /* W
8930: 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20  e cannot change 
8940: 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20  ownership while 
8950: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
8960: 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65   lock! */.    re
8970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8980: 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  SE;.  }.  OSTRAC
8990: 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e  E4("Transfer own
89a0: 65 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f  ership of %d fro
89b0: 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20  m %d to %d\n",. 
89c0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
89d0: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c  ->h, pFile->tid,
89e0: 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65   hSelf);.  pFile
89f0: 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20  ->tid = hSelf;. 
8a00: 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63   if (pFile->pLoc
8a10: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20  k != NULL) {.   
8a20: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
8a30: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
8a40: 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
8a50: 6b 49 6e 66 6f 28 70 46 69 6c 65 2c 20 26 70 46  kInfo(pFile, &pF
8a60: 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a  ile->pLock, 0);.
8a70: 20 20 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f      OSTRACE5("LO
8a80: 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20  CK    %d is now 
8a90: 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46  %s(%s,%d)\n", pF
8aa0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
8ab0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
8ac0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
8ad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
8ae0: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
8af0: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
8b00: 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  ), pFile->pLock-
8b10: 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72  >cnt);.    retur
8b20: 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
8b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8b40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  TE_OK;.  }.}.#el
8b50: 73 65 20 20 2f 2a 20 69 66 20 6e 6f 74 20 53 51  se  /* if not SQ
8b60: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8b70: 2a 2f 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c  */.  /* On singl
8b80: 65 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64  e-threaded build
8b90: 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61  s, ownership tra
8ba0: 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70  nsfer is a no-op
8bb0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61   */.# define tra
8bc0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58  nsferOwnership(X
8bd0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
8be0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52  if /* SQLITE_THR
8bf0: 45 41 44 53 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a  EADSAFE */.../*.
8c00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8c10: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
8c20: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
8c30: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
8c40: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
8c50: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
8c60: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
8c70: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
8c80: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
8c90: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
8ca0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
8cb0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
8cc0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
8cd0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8ce0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
8cf0: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
8d00: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
8d10: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
8d20: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
8d30: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
8d40: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
8d50: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
8d60: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
8d70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8d80: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
8d90: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
8da0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
8db0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
8dc0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
8dd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8de0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8df0: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
8e00: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
8e10: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
8e20: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
8e30: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
8e40: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
8e50: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
8e60: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
8e70: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
8e80: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
8e90: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c  .  if( pFile->pL
8ea0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ock->locktype>SH
8eb0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
8ec0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
8ed0: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
8ee0: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
8ef0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
8f00: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ds it..  */.  if
8f10: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
8f20: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
8f30: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
8f40: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
8f50: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
8f60: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
8f70: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
8f80: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
8f90: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
8fa0: 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20  LCK;.    if (-1 
8fb0: 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  == fcntl(pFile->
8fc0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
8fd0: 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  k)) {.      int 
8fe0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8ff0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9000: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
9010: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
9020: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
9030: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
9040: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9050: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
9060: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
9070: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
9080: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
9090: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
90a0: 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
90b0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
90c0: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
90d0: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
90e0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
90f0: 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
9100: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
9110: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9120: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
9130: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
9140: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
9150: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
9160: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
9170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9180: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
9190: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
91a0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
91b0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
91c0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
91d0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
91e0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
91f0: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
9200: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
9210: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
9220: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
9230: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
9240: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
9250: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
9260: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
9270: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
9280: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
9290: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
92a0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
92b0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
92c0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
92d0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
92e0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
92f0: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
9300: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
9310: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
9320: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
9330: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
9340: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
9350: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
9360: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
9370: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
9380: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
9390: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
93a0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
93b0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
93c0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
93d0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
93e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
93f0: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
9400: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
9410: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
9420: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
9430: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
9440: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9450: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
9460: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
9470: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54  ocktype){.  /* T
9480: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
9490: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
94a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
94b0: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
94c0: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
94d0: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
94e0: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
94f0: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
9500: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
9510: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
9520: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
9530: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
9540: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
9550: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
9560: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
9570: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
9580: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
9590: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
95a0: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
95b0: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
95c0: 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73  ble with windows
95d0: 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61   systems simulta
95e0: 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63  neously.  ** acc
95f0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
9600: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
9610: 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65  n case that is e
9620: 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20  ver required..  
9630: 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20  **.  ** Symbols 
9640: 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20  defined in os.h 
9650: 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70  indentify the 'p
9660: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64  ending byte' and
9670: 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20   the 'reserved. 
9680: 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20   ** byte', each 
9690: 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20  single bytes at 
96a0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
96b0: 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61  ts, and the 'sha
96c0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
96d0: 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66  nge', a range of
96e0: 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20   510 bytes at a 
96f0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
9700: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  t..  **.  ** To 
9710: 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
9720: 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63  lock, a read-loc
9730: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e  k is obtained on
9740: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20   the 'pending.  
9750: 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68  ** byte'.  If th
9760: 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
9770: 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  , a random byte 
9780: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
9790: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
97a0: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
97b0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
97c0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
97d0: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  te' released..  
97e0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
97f0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
9800: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
9810: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
9820: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
9830: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
9840: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
9850: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
9860: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
9870: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
9880: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
9890: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
98a0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
98b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
98c0: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
98d0: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
98e0: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
98f0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
9900: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
9910: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
9920: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
9930: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
9940: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
9950: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
9960: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
9970: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
9980: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
9990: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
99a0: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
99b0: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
99c0: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
99d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
99e0: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
99f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
9a00: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
9a10: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
9a20: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
9a30: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
9a40: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
9a50: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
9a60: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
9a70: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
9a80: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
9a90: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
9aa0: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
9ab0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
9ac0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
9ad0: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
9ae0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
9af0: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
9b00: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
9b10: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
9b20: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
9b30: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
9b40: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
9b50: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
9b60: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
9b70: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
9b80: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
9b90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73  **.  ** The reas
9ba0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  on a single byte
9bb0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
9bc0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27  instead of the '
9bd0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9be0: 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20   range' is that 
9bf0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
9c00: 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20   windows do not 
9c10: 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63  support read-loc
9c20: 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ks. By.  ** lock
9c30: 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ing a random byt
9c40: 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20  e from a range, 
9c50: 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45  concurrent SHARE
9c60: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73  D locks may exis
9c70: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  t.  ** even if t
9c80: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  he locking primi
9c90: 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77  tive used is alw
9ca0: 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ays a write-lock
9cb0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ..  */.  int rc 
9cc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
9cd0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
9ce0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
9cf0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
9d00: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70  kInfo *pLock = p
9d10: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73  File->pLock;.  s
9d20: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
9d30: 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73  ;.  int s;..  as
9d40: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
9d50: 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20   OSTRACE7("LOCK 
9d60: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
9d70: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22  %s,%d) pid=%d\n"
9d80: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
9d90: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
9da0: 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
9db0: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
9dc0: 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c  cktype),.      l
9dd0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63  ocktypeName(pLoc
9de0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c  k->locktype), pL
9df0: 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69  ock->cnt , getpi
9e00: 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  d());..  /* If t
9e10: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
9e20: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
9e30: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
9e40: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
9e50: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
9e60: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
9e70: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
9e80: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
9e90: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
9ea0: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
9eb0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
9ec0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
9ed0: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
9ee0: 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
9ef0: 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E3("LOCK    %d %
9f00: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
9f10: 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
9f20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ,.            lo
9f30: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
9f40: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
9f50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9f60: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9f70: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
9f80: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
9f90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9fa0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
9fb0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
9fc0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9fd0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
9fe0: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
9ff0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
a000: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
a010: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
a020: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
a030: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
a040: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
a050: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
a060: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
a070: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
a080: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
a090: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
a0a0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a0b0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
a0c0: 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c  ad owns the pFil
a0d0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  e..  */.  rc = t
a0e0: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
a0f0: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
a100: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a110: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
a120: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
a130: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
a140: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
a150: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
a160: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
a170: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
a180: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
a190: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
a1a0: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
a1b0: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
a1c0: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
a1d0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
a1e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
a1f0: 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e!=pLock->lockty
a200: 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  pe && .         
a210: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
a220: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
a230: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  || locktype>SHAR
a240: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
a250: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a260: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
a270: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
a280: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
a290: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
a2a0: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
a2b0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
a2c0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
a2d0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
a2e0: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
a2f0: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
a300: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
a310: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
a320: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
a330: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
a340: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
a350: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
a360: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a370: 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  || pLock->lockty
a380: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
a390: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
a3a0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
a3b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
a3c0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
a3d0: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
a3e0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
a3f0: 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  cnt>0 );.    pFi
a400: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
a410: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
a420: 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
a430: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
a440: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
a450: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
a460: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
a470: 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68  1L;..  lock.l_wh
a480: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a490: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
a4a0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
a4b0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
a4c0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
a4d0: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
a4e0: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
a4f0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
a500: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
a510: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
a520: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
a530: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
a540: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a550: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
a560: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
a570: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
a580: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
a590: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
a5a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a5b0: 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  = (locktype==SHA
a5c0: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
a5d0: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
a5e0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
a5f0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
a600: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a610: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a620: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
a630: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  (-1) ){.      in
a640: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
a650: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
a660: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
a670: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
a680: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
a690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
a6a0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
a6b0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
a6c0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a6d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
a6e0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
a6f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
a700: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
a710: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
a720: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
a730: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
a740: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
a750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
a760: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
a770: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
a780: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
a790: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
a7a0: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t tErrno = 0;.  
a7b0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
a7c0: 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  >cnt==0 );.    a
a7d0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
a7e0: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20  cktype==0 );..  
a7f0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
a800: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
a810: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a820: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a830: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a840: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
a850: 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28   if( (s = fcntl(
a860: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
a870: 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29  K, &lock))==(-1)
a880: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
a890: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
a8a0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
a8b0: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
a8c0: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
a8d0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
a8e0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
a8f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
a900: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a910: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
a920: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
a930: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
a940: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  k)!=0 ){.      i
a950: 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20  f( s != -1 ){.  
a960: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
a970: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
a980: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
a990: 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  */.        tErrn
a9a0: 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20  o = errno; .    
a9b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
a9c0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
a9d0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
a9e0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
a9f0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
aa00: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
aa10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
aa20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
aa30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
aa40: 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
aa50: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  nd_lock;.      }
aa60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
aa70: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
aa80: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
aa90: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
aaa0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
aab0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
aac0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
aad0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
aae0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
aaf0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
ab00: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
ab10: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ab20: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
ab30: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
ab40: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
ab50: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
ab60: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
ab70: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
ab80: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
ab90: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
aba0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
abb0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
abc0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
abd0: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
abe0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
abf0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
ac00: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
ac10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
ac20: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
ac30: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
ac40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
ac50: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
ac60: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
ac70: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
ac80: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
ac90: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
aca0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
acb0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
acc0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
acd0: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
ace0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
acf0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
ad00: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ad10: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
ad20: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
ad30: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
ad40: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
ad50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ad60: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
ad70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad80: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
ad90: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
ada0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
adb0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
adc0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
add0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ade0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
adf0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
ae00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
ae20: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
ae30: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
ae40: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
ae50: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
ae60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ae70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
ae80: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ae90: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
aea0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
aeb0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
aec0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
aed0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
aee0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
aef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af00: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
af10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
af20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
af30: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
af40: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
af50: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
af60: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
af70: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
af80: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
af90: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
afa0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  NG_LOCK;.    pLo
afb0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  ck->locktype = P
afc0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
afd0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
afe0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
aff0: 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b    OSTRACE4("LOCK
b000: 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
b010: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
b020: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b030: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
b040: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
b050: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
b060: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b070: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
b080: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
b090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
b0a0: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
b0b0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
b0c0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
b0d0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
b0e0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
b0f0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
b100: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
b110: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
b120: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
b130: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
b140: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
b150: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
b160: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
b170: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
b180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
b190: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
b1a0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
b1b0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20  kInfo *pLock;.  
b1c0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
b1d0: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
b1e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
b1f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
b200: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
b210: 74 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t h;..  assert( 
b220: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
b230: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
b240: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
b250: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
b260: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
b270: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b280: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
b290: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ock->locktype, p
b2a0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
b2b0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
b2c0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
b2d0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
b2e0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
b2f0: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
b300: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b310: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
b320: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
b330: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
b340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
b350: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69  ISUSE;.  }.  uni
b360: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
b370: 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20   h = pFile->h;. 
b380: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
b390: 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28  pLock;.  assert(
b3a0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29   pLock->cnt!=0 )
b3b0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
b3c0: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
b3d0: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
b3e0: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
b3f0: 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe==pFile->lockt
b400: 79 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ype );.    Simul
b410: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b420: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
b430: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
b440: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
b450: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
b460: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
b470: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
b480: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
b490: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
b4a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b4b0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b4c0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b4d0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
b4e0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
b4f0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b500: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
b510: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
b520: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
b530: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
b540: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
b550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
b560: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
b570: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
b580: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20  IOERR_RDLOCK);. 
b590: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
b5a0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
b5b0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
b5c0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
b5d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 09  rno;.        }..
b5e0: 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f  ...goto end_unlo
b5f0: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
b600: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
b610: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b620: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
b630: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
b640: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
b650: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
b660: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
b670: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
b680: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
b690: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
b6a0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
b6b0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
b6c0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  ) ){.      pLock
b6d0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
b6e0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
b6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  lse{.      int t
b700: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
b710: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b720: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b730: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b740: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
b750: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
b760: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
b770: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
b780: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
b790: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 09 09 09 67  no;.      }....g
b7a0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
b7b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b7c0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
b7d0: 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  K ){.    struct 
b7e0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70  unixOpenCnt *pOp
b7f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
b800: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
b810: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
b820: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
b830: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
b840: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
b850: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
b860: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
b870: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
b880: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
b890: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
b8a0: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
b8b0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
b8c0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
b8d0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
b8e0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
b8f0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b900: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
b910: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
b920: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69  n = 0L;.      Si
b930: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b940: 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
b950: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
b960: 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
b970: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b980: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
b990: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
b9a0: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
b9c0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
b9d0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
b9e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
b9f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ba00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ba10: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
ba20: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
ba30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
ba40: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
ba50: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ba60: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
ba70: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ba80: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
ba90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
baa0: 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09  ck->cnt = 1;....
bab0: 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b  .goto end_unlock
bac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bad0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
bae0: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
baf0: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
bb00: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
bb10: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
bb20: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
bb30: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
bb40: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
bb50: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
bb60: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
bb70: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
bb80: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
bb90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bba0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bbb0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  .      pOpen = p
bbc0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
bbd0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
bbe0: 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
bbf0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
bc00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
bc10: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26  pen->nLock==0 &&
bc20: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
bc30: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
bc40: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
bc50: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
bc60: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
bc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
bc80: 65 20 70 65 6e 64 69 6e 67 20 66 64 73 2c 20 62  e pending fds, b
bc90: 75 74 20 69 66 20 63 6c 6f 73 69 6e 67 20 66 61  ut if closing fa
bca0: 69 6c 73 20 64 6f 6e 27 74 20 66 72 65 65 20 74  ils don't free t
bcb0: 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 20  he array.       
bcc0: 20 20 20 2a 2a 20 61 73 73 69 67 6e 20 2d 31 20     ** assign -1 
bcd0: 74 6f 20 74 68 65 20 73 75 63 63 65 73 73 66 75  to the successfu
bce0: 6c 6c 79 20 63 6c 6f 73 65 64 20 64 65 73 63 72  lly closed descr
bcf0: 69 70 74 6f 72 73 20 61 6e 64 20 72 65 63 6f 72  iptors and recor
bd00: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
bd10: 2a 2a 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e  ** error.  The n
bd20: 65 78 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ext attempt to u
bd30: 6e 6c 6f 63 6b 20 77 69 6c 6c 20 74 72 79 20 61  nlock will try a
bd40: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  gain. */.       
bd50: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 61 50     if( pOpen->aP
bd60: 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30 20 29 20  ending[i] < 0 ) 
bd70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
bd80: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 4f      if( close(pO
bd90: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
bda0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bdb0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bdc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
bdd0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
bde0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
bdf0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
be00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
be10: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20  en->aPending[i] 
be20: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
be30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
be40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
be50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
be60: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be70: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
be80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65  ;.          pOpe
be90: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
bea0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 65 6e  .          pOpen
beb0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
bec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bed0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e  }.    }.  }...en
bee0: 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  d_unlock:.  unix
bef0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
bf00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bf10: 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  K ) pFile->lockt
bf20: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
bf30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bf40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
bf50: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
bf60: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
bf70: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
bf80: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
bf90: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
bfa0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
bfb0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
bfc0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
bfd0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
bfe0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
bff0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
c000: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
c010: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
c020: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
c030: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
c040: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
c050: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
c060: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
c070: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
c080: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
c090: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
c0a0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
c0b0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
c0c0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
c0d0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
c0e0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
c0f0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
c100: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
c110: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
c120: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
c130: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
c140: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
c150: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
c160: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
c170: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
c180: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c190: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
c1a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c1b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
c1c0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
c1d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
c1e0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
c1f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c200: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
c210: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
c220: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
c230: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
c240: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
c250: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c260: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
c270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c280: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
c290: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
c2a0: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
c2b0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
c2c0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
c2d0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
c2e0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
c2f0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
c300: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
c310: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
c320: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
c330: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
c340: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
c350: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
c360: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
c370: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
c380: 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  );.    OpenCount
c390: 65 72 28 2d 31 29 3b 0a 20 20 20 20 6d 65 6d 73  er(-1);.    mems
c3a0: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
c3b0: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
c3c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c3d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c3e0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
c3f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c400: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
c410: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
c420: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c430: 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
c440: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c450: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
c460: 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  ;.    unixUnlock
c470: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
c480: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
c490: 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
c4a0: 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69  le->pOpen && pFi
c4b0: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
c4c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
c4d0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
c4e0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
c4f0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
c500: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
c510: 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
c520: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
c530: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
c540: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
c550: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
c560: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
c570: 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
c580: 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
c590: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
c5a0: 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
c5b0: 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
c5c0: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
c5d0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a    */.      int *
c5e0: 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75  aNew;.      stru
c5f0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
c600: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
c610: 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77  Open;.      aNew
c620: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
c630: 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  oc(pOpen->aPendi
c640: 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
c650: 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
c660: 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nt) );.      if(
c670: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
c680: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
c690: 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c  oc fails, just l
c6a0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
c6b0: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20  criptor */.     
c6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c6d0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
c6e0: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
c6f0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
c700: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
c710: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
c720: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
c730: 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ding++;.        
c740: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
c750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c760: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
c770: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
c780: 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
c790: 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
c7a0: 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
c7b0: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
c7c0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
c7d0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
c7e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
c7f0: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
c800: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
c810: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
c820: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
c830: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
c840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c880: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
c900: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
c910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c920: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
c930: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
c940: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
c950: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
c960: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
c970: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
c980: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
c990: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
c9a0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
c9b0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
c9c0: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
c9d0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
c9e0: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
c9f0: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
ca00: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
ca10: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
ca20: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
ca30: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
ca40: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
ca50: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
ca60: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
ca70: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
ca80: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
ca90: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
caa0: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
cab0: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
cac0: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
cad0: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
cae0: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
caf0: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
cb00: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
cb10: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
cb20: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
cb30: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
cb40: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
cb50: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
cb60: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
cb70: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
cb80: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
cb90: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
cba0: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
cbb0: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
cbc0: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
cbd0: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
cbe0: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
cbf0: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
cc00: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
cc10: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
cc20: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
cc30: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
cc40: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
cc50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cc60: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
cc70: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
cc80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cc90: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
cca0: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
ccb0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
ccc0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
ccd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
cce0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
ccf0: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
cd00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
cd10: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
cd20: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
cd30: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
cd40: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
cd50: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
cd60: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
cd70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cd80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
cd90: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
cda0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
cdb0: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
cdc0: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
cdd0: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
cde0: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
cdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
ce00: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
ce10: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
ce20: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
ce30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
ce40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce80: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
ce90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ceb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
cee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cef0: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
cf00: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
cf10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
cf30: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
cf40: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
cf50: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
cf60: 73 74 69 6e 67 20 6f 66 20 73 65 70 61 72 61 74  sting of separat
cf70: 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20  e lock.** files 
cf80: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
cf90: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
cfa0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
cfb0: 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a  s works on just.
cfc0: 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  ** about every f
cfd0: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
cfe0: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
cff0: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
d000: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
d010: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
d020: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
d030: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
d040: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
d050: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
d060: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
d070: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
d080: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
d090: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
d0a0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
d0b0: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
d0c0: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
d0d0: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
d0e0: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
d0f0: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
d100: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
d110: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
d120: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
d130: 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
d140: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
d150: 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
d160: 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
d170: 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
d180: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
d190: 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
d1a0: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
d1b0: 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65  ng a file in the
d1c0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
d1d0: 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  as the.** databa
d1e0: 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
d1f0: 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
d200: 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
d210: 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
d220: 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   The existance o
d230: 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d  f a lock file im
d240: 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
d250: 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
d260: 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65  her lock.** type
d270: 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
d280: 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
d290: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
d2a0: 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
d2b0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
d2c0: 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
d2d0: 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
d2e0: 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
d2f0: 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
d300: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69  k file..*/.#defi
d310: 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
d320: 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
d330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d340: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
d350: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
d360: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
d370: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
d380: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
d390: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
d3a0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
d3b0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
d3c0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
d3d0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
d3e0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
d3f0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
d400: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
d410: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
d420: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
d430: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
d440: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
d450: 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
d460: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
d470: 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
d480: 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
d490: 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
d4a0: 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
d4b0: 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
d4c0: 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
d4d0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
d4e0: 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
d4f0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d500: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
d510: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
d520: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d530: 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
d540: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
d550: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d560: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
d570: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d580: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
d590: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
d5a0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
d5b0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
d5c0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
d5d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d5e0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
d5f0: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
d600: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
d610: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
d620: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
d630: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
d640: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
d650: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
d660: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
d670: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
d680: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
d690: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
d6a0: 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
d6b0: 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
d6c0: 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
d6d0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
d6e0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
d6f0: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
d700: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
d710: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
d720: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
d730: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
d740: 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
d750: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
d760: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
d770: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
d780: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
d790: 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
d7a0: 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  = access(zLockFi
d7b0: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
d7c0: 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
d7d0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
d7e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
d7f0: 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20  c, reserved);.  
d800: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
d810: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
d820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
d830: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
d840: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
d850: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
d860: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
d870: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
d880: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d890: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
d8a0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
d8b0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
d8c0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
d8d0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
d8e0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
d8f0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
d900: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
d910: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
d920: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
d930: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
d940: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
d950: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
d960: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
d970: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
d980: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
d990: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
d9a0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
d9b0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
d9c0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
d9d0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
d9e0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
d9f0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
da00: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
da10: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
da20: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
da30: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
da40: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
da50: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
da60: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
da70: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
da80: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
da90: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
daa0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
dab0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
dac0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
dad0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
dae0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
daf0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
db00: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
db10: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
db20: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
db30: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
db40: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
db50: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
db60: 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
db70: 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
db80: 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
db90: 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
dba0: 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
dbb0: 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
dbc0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
dbd0: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
dbe0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
dbf0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
dc00: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
dc10: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
dc20: 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68  ;.  int fd;.  ch
dc30: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
dc40: 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
dc50: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
dc60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dc70: 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
dc80: 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
dc90: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
dca0: 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
dcb0: 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
dcc0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
dcd0: 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
dce0: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
dcf0: 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
dd00: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
dd10: 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
dd20: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
dd30: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
dd40: 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57  ype;.#if !OS_VXW
dd50: 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ORKS.    /* Alwa
dd60: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
dd70: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
dd80: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
dd90: 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
dda0: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
ddb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ddc0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
ddd0: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
dde0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
ddf0: 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65  = open(zLockFile
de00: 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41  ,O_RDONLY|O_CREA
de10: 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a  T|O_EXCL,0600);.
de20: 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
de30: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
de40: 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
de50: 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ile, someone els
de60: 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65  e may have stole
de70: 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  n the lock */.  
de80: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
de90: 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
dea0: 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
deb0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
dec0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
ded0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
dee0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
def0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
df00: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
df10: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
df20: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
df30: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
df40: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
df50: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
df60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
df70: 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66  rn rc;.  } .  if
df80: 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20  ( close(fd) ){. 
df90: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
dfa0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dfb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
dfc0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20  RR_CLOSE;.  }.  
dfd0: 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
dfe0: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
dff0: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
e000: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
e010: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
e020: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e030: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
e040: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
e050: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
e060: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
e070: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
e080: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
e090: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
e0a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
e0b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
e0c0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
e0d0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
e0e0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
e0f0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
e100: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
e110: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
e120: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
e130: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e140: 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
e150: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
e160: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
e170: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
e180: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e190: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e1a0: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
e1b0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e1c0: 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
e1d0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
e1e0: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
e1f0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
e200: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e210: 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
e220: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
e230: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
e240: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
e250: 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
e260: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
e270: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
e280: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
e290: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
e2a0: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
e2b0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
e2c0: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
e2d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e2e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
e2f0: 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
e300: 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
e310: 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
e320: 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
e330: 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
e340: 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
e350: 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
e360: 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
e370: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
e380: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
e390: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
e3a0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
e3b0: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
e3c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e3d0: 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
e3e0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
e3f0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
e400: 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
e410: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
e420: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
e430: 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
e440: 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
e450: 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
e460: 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54  ;.    if( ENOENT
e470: 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
e480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
e490: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e4a0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e4b0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
e4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
e4d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
e4e0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
e4f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e500: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
e510: 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
e520: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e530: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
e540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e550: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e560: 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
e570: 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
e580: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
e590: 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
e5a0: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
e5b0: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
e5c0: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
e5d0: 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
e5e0: 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
e5f0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e600: 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
e610: 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
e620: 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
e630: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
e640: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
e650: 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
e660: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
e670: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e690: 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
e6a0: 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
e6b0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
e6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e780: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
e790: 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e7c0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
e7d0: 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
e7e0: 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
e7f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  ng..**.** Omit t
e800: 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
e810: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
e820: 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
e830: 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
e840: 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
e850: 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
e860: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
e870: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
e880: 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 20 66  OS_VXWORKS../* f
e890: 6c 6f 63 6b 2d 73 74 79 6c 65 20 72 65 73 65 72  lock-style reser
e8a0: 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ved lock checkin
e8b0: 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  g following the 
e8c0: 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 20 2a 2a  behavior of . **
e8d0: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
e8e0: 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20  edLock, see the 
e8f0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
e900: 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63  dLock function c
e910: 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69  omments */.stati
e920: 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
e930: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e940: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e950: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
e960: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e970: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
e980: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
e990: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e9a0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
e9b0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
e9c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
e9d0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
e9e0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
e9f0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ea00: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
ea10: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
ea20: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
ea30: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
ea40: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ea50: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
ea60: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
ea70: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
ea80: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
ea90: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
eaa0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
eab0: 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
eac0: 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74  ved ){.    /* at
ead0: 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
eae0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
eaf0: 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69   lrc = flock(pFi
eb00: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
eb10: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
eb20: 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20  f( !lrc ){.     
eb30: 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b   /* got the lock
eb40: 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20  , unlock it */. 
eb50: 20 20 20 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b       lrc = flock
eb60: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
eb70: 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
eb80: 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
eb90: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
eba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
ebb0: 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
ebc0: 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
ebd0: 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
ebe0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
ebf0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ec00: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ec10: 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  K); .        if(
ec20: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
ec30: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
ec40: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ec50: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
ec60: 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
ec70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec80: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
ec90: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
eca0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ecb0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
ecc0: 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
ecd0: 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
ece0: 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
ecf0: 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
ed00: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ed10: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ed20: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
ed30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ed40: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
ed50: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ed60: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ed70: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
ed80: 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
ed90: 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
eda0: 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
edb0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  %d %d %d\n", pFi
edc0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
edd0: 76 65 64 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ved);..#ifdef SQ
ede0: 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
edf0: 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
ee00: 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
ee10: 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
ee20: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
ee30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ee40: 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
ee50: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ee60: 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
ee70: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
ee80: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
ee90: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
eea0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
eeb0: 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
eec0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
eed0: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
eee0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
eef0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
ef00: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ef10: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
ef20: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
ef30: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
ef40: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
ef50: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
ef60: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
ef70: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
ef80: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
ef90: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
efa0: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
efb0: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
efc0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
efd0: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
efe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
eff0: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
f000: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
f010: 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
f020: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
f030: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
f040: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
f050: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
f060: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
f070: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
f080: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f090: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f0a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f0b0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
f0c0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f0d0: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
f0e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f0f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
f100: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
f110: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
f120: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
f130: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
f140: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
f150: 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ype;.  }.  OSTRA
f160: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
f170: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
f180: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
f190: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
f1a0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
f1b0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
f1c0: 66 61 69 6c 65 64 22 29 3b 0a 23 69 66 64 65 66  failed");.#ifdef
f1d0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
f1e0: 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
f1f0: 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
f200: 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
f210: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
f220: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f230: 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
f240: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
f250: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f260: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
f270: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
f280: 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
f290: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f2a0: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f2b0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f2c0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f2d0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
f2e0: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
f2f0: 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
f300: 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
f310: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
f320: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
f330: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f340: 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  e, getpid());.  
f350: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
f360: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
f370: 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
f380: 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
f390: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
f3a0: 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
f3b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f3c0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f3d0: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
f3e0: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
f3f0: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
f400: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
f410: 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
f420: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
f430: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f440: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f450: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f460: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
f470: 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
f480: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
f490: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f4a0: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f4b0: 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e  if (rc) {.    in
f4c0: 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72  t r, tErrno = er
f4d0: 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c  rno;.    r = sql
f4e0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
f4f0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
f500: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f510: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
f520: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b  LOCK_ERROR(r) ){
f530: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
f540: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
f550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f560: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
f570: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
f580: 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c 49     if( (r & SQLI
f590: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
f5a0: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
f5b0: 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55     r = SQLITE_BU
f5c0: 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  SY;.    }.#endif
f5d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
f5e0: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
f5f0: 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  ORS */.    .    
f600: 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c  return r;.  } el
f610: 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
f620: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
f630: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
f640: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
f650: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
f660: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
f670: 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
f680: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
f690: 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
f6a0: 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
f6b0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
f6c0: 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
f6d0: 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
f6e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f6f0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f700: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
f710: 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
f730: 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
f740: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
f750: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f760: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7b0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f800: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
f810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f820: 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
f830: 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
f840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f850: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
f860: 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
f870: 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
f880: 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
f890: 6b 73 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ks..*/.#if OS_VX
f8a0: 57 4f 52 4b 53 0a 0a 2f 2a 20 4e 61 6d 65 64 73  WORKS../* Nameds
f8b0: 65 6d 2d 73 74 79 6c 65 20 72 65 73 65 72 76 65  em-style reserve
f8c0: 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 20  d lock checking 
f8d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65  following the be
f8e0: 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a 20 75 6e  havior of .** un
f8f0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
f900: 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69  ock, see the uni
f910: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
f920: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d  ck function comm
f930: 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  ents */.static i
f940: 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
f950: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f960: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
f970: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
f980: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f990: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
f9a0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
f9b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f9c0: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
f9d0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
f9e0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
f9f0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
fa00: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
fa10: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
fa20: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
fa30: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
fa40: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
fa50: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
fa60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
fa70: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
fa80: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
fa90: 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
faa0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
fab0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
fac0: 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
fad0: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
fae0: 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
faf0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
fb00: 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
fb10: 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
fb20: 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
fb30: 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
fb40: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
fb50: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
fb60: 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
fb70: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
fb80: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
fb90: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
fba0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
fbb0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
fbc0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
fbd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fbe0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fbf0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
fc00: 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
fc10: 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
fc20: 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
fc30: 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
fc40: 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
fc50: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
fc60: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
fc70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fc80: 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
fc90: 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
fca0: 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
fcb0: 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
fcc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
fcd0: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
fce0: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
fcf0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
fd00: 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
fd10: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
fd20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fd30: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  ..static int sem
fd40: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
fd50: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fd60: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
fd70: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fd80: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
fd90: 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  fd;.  sem_t *pSe
fda0: 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  m = pFile->pOpen
fdb0: 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
fdc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fdd0: 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
fde0: 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
fdf0: 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
fe00: 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
fe10: 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
fe20: 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
fe30: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
fe40: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
fe50: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
fe60: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
fe70: 6b 74 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20  ktype;.    rc = 
fe80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
fe90: 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
fea0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
feb0: 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
fec0: 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
fed0: 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
fee0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
fef0: 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
ff00: 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
ff10: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
ff20: 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
ff30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
ff40: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
ff50: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
ff60: 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  /.  pFile->lockt
ff70: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
ff80: 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
ff90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ffa0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
ffb0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
ffc0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
ffd0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
ffe0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fff0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
10000 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
10010 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20  >pOpen->pSem;.. 
10020 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
10040 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
10050 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
10060 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %d pid=%d\n", 
10070 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
10080 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c  pe,..   pFile->l
10090 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
100a0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  ));.  assert( lo
100b0 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
100c0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
100d0 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
100e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
100f0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
10100 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
10110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10120 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
10130 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
10140 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
10150 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
10160 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
10170 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
10180 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
10190 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
101a0 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
101b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
101c0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
101d0 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
101e0 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
101f0 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
10200 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
10210 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
10220 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10230 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10240 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10250 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
10260 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10270 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
10280 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10290 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
102a0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
102b0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
102c0 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
102d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
102e0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
102f0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
10300 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
10310 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10320 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
10330 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10340 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10350 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
10360 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10370 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10380 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
10390 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
103a0 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
103b0 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
103c0 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
103d0 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  Cnt(pFile->pOpen
103e0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
103f0 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
10400 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
10410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10420 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
10430 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
10440 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  */./*.** Named s
10450 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
10460 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
10470 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  le on VxWorks..*
10480 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10490 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d  * End of the nam
104a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
104b0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
104c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
104d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
10530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10570 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10590 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e  Begin AFP Lockin
105a0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73  ***.**.** AFP is
105d0 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e   the Apple Filin
105e0 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50  g Protocol.  AFP
105f0 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69   is a network fi
10600 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a  lesystem found.*
10610 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e  * on Apple Macin
10620 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d  tosh computers -
10630 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53   both OS9 and OS
10640 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70  X..**.** Third-p
10650 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74  arty implementat
10660 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20  ions of AFP are 
10670 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
10680 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a  this code here.*
10690 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  * only works on 
106a0 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  OSX..*/..#if def
106b0 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29  ined(__DARWIN__)
106c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
106d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
106e0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
106f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
10700 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
10710 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
10720 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
10730 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
10740 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
10750 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10760 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
10770 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
10780 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
10790 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  g sharedByte;.  
107a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
107b0 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42  th;.};..struct B
107c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
107d0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
107e0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
107f0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
10800 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
10810 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
10820 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
10830 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
10840 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
10850 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
10860 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
10870 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
10880 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
10890 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
108a0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
108b0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
108c0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
108d0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
108e0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
108f0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
10900 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
10910 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
10920 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
10930 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
10960 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
10970 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
10980 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
10990 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
109a0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
109b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
109c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
109d0 50 42 32 29 0a 0a 2f 2a 20 0a 20 2a 2a 20 52 65  PB2)../* . ** Re
109e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
109f0 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
10a00 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
10a10 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
10a20 74 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  t _AFPFSSetLock(
10a30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
10a40 61 74 68 2c 20 0a 20 20 75 6e 69 78 46 69 6c 65  ath, .  unixFile
10a50 20 2a 70 46 69 6c 65 2c 20 0a 20 20 75 6e 73 69   *pFile, .  unsi
10a60 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
10a70 66 66 73 65 74 2c 20 0a 20 20 75 6e 73 69 67 6e  ffset, .  unsign
10a80 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
10a90 67 74 68 2c 20 0a 20 20 69 6e 74 20 73 65 74 4c  gth, .  int setL
10aa0 6f 63 6b 46 6c 61 67 0a 29 7b 0a 20 20 73 74 72  ockFlag.){.  str
10ab0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
10ac0 6b 50 42 32 20 20 20 20 20 20 20 70 62 3b 0a 20  kPB2       pb;. 
10ad0 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20   int            
10ae0 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20           err;.  
10af0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
10b00 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
10b10 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
10b20 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
10b30 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
10b40 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
10b50 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
10b60 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
10b70 20 20 2f 2f 53 69 6d 75 6c 61 74 65 49 4f 45 72    //SimulateIOEr
10b80 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
10b90 2f 2f 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  //SimulateIOErro
10ba0 72 28 20 70 62 2e 66 64 3d 28 2d 31 29 20 29 0a  r( pb.fd=(-1) ).
10bb0 20 20 2f 2f 53 69 6d 75 6c 61 74 65 49 4f 45 72    //SimulateIOEr
10bc0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
10bd0 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50  .  OSTRACE6("AFP
10be0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
10bf0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
10c00 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
10c10 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
10c20 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
10c30 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
10c40 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
10c50 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
10c60 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
10c70 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
10c80 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
10c90 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
10ca0 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
10cb0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
10cc0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10cd0 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
10ce0 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE4("AFPSETLOCK 
10cf0 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
10d00 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
10d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
10d20 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
10d30 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23  rror(tErrno));.#
10d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
10d50 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
10d60 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
10d70 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
10d80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10d90 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10da0 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10dc0 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
10dd0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
10de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10df0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
10e00 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
10e10 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
10e20 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
10e30 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10e40 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10e50 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10e60 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10e70 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  E_OK;.  }.}../* 
10ea0 41 46 50 2d 73 74 79 6c 65 20 72 65 73 65 72 76  AFP-style reserv
10eb0 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ed lock checking
10ec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62   following the b
10ed0 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a 20 75  ehavior of .** u
10ee0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
10ef0 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e  Lock, see the un
10f00 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
10f10 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  ock function com
10f20 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63 20  ments */.static 
10f30 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
10f40 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
10f50 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
10f60 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
10f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10f80 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
10f90 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
10fa0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10fb0 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
10fc0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
10fd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10fe0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
10ff0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
11000 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
11010 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11020 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
11030 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
11040 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
11050 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a  Context;.  .  /*
11060 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
11070 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
11080 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
11090 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
110a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
110b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
110c0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
110d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
110e0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
110f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
11100 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
11110 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
11120 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
11130 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
11140 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
11150 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
11160 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
11170 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
11180 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
11190 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
111a0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
111b0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
111c0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
111d0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
111e0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
111f0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
11200 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
11210 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 5f 41  /.      lrc = _A
11220 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
11230 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
11240 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
11250 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
11260 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
11270 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
11280 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
11290 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
112a0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
112b0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
112c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
112d0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
112e0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
112f0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
11300 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45   .  OSTRACE4("TE
11310 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
11320 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
11330 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
11340 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
11350 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
11360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 46  urn rc;.}../* AF
11370 50 2d 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20  P-style locking 
11380 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65  following the be
11390 68 61 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f  havior of unixLo
113a0 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78  ck, see the unix
113b0 4c 6f 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  Lock .** functio
113c0 6e 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64  n comments for d
113d0 65 74 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d  etails of lock m
113e0 61 6e 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74  anagement. */.st
113f0 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
11400 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11410 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
11420 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11430 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
11440 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11450 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
11460 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
11470 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
11480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
11490 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
114a0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
114b0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
114c0 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
114d0 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69   %d %s was %s pi
114e0 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
114f0 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  h,.         lock
11500 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
11510 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
11520 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
11530 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  ), getpid());.. 
11540 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11550 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
11560 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
11570 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
11580 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
11590 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
115a0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
115b0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
115c0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
115d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
115e0 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
115f0 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
11600 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
11610 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
11620 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  {.    OSTRACE3("
11630 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
11640 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
11650 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11660 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
11670 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
11680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11690 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
116a0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
116b0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
116c0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
116d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
116e0 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
116f0 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
11700 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
11710 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
11720 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
11730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
11740 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
11750 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
11760 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
11770 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11780 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
11790 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
117a0 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
117b0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
117c0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
117d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
117e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
117f0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
11800 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
11810 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
11820 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
11830 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
11840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11850 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
11860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
11870 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
11880 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
11890 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
118a0 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
118b0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
118c0 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
118d0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
118e0 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
118f0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
11900 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
11910 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
11920 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
11930 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
11940 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
11950 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
11960 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
11970 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
11980 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
11990 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
119a0 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
119b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
119c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
119d0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
119e0 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
119f0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
11a00 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
11a10 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
11a20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
11a30 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
11a40 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
11a50 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
11a60 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
11a70 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
11a80 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
11a90 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
11aa0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ck..  */.  if( l
11ab0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
11ac0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
11ad0 6c 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  lk, lrc1, lrc2, 
11ae0 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a  lrc1Errno;.    .
11af0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
11b00 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
11b10 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
11b20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
11b30 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
11b40 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
11b50 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
11b60 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
11b70 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63  random(); .    c
11b80 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79  ontext->sharedBy
11b90 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66  te = (lk & 0x7ff
11ba0 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
11bb0 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
11bc0 63 31 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  c1 = _AFPFSSetLo
11bd0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
11be0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
11bf0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
11c00 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72  ST+context->shar
11c10 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
11c20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11c30 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
11c40 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
11c50 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
11c70 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
11c80 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
11c90 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 5f 41 46  /.    lrc2 = _AF
11ca0 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
11cb0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
11cc0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
11cd0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
11ce0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11cf0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
11d00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11d10 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
11d20 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
11d30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
11d40 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
11d50 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
11d60 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
11d70 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
11d80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
11d90 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
11da0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
11db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
11dc0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
11dd0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11de0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11df0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
11e00 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
11e10 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
11e20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
11e30 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
11e40 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
11e50 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
11e60 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
11e70 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
11e80 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
11e90 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
11ea0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
11eb0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
11ec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
11ed0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
11ee0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
11ef0 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
11f00 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e    if (locktype >
11f10 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
11f20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
11f30 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe < RESERVED_LO
11f40 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
11f50 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
11f60 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
11f70 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46      failed = _AF
11f80 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
11f90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
11fa0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
11fb0 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
11fc0 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
11fd0 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
11fe0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
11ff0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12000 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12010 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
12020 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12030 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
12040 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
12050 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
12060 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
12070 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
12080 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
12090 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
120a0 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
120b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
120c0 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
120d0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
120e0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
120f0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
12120 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
12130 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
12140 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
12150 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
12160 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
12170 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
12180 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
12190 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
121a0 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
121b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
121c0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
121d0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
12200 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
12210 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
12220 61 69 6c 65 64 32 20 3d 20 5f 41 46 50 46 53 53  ailed2 = _AFPFSS
12230 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
12240 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
12270 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73  RST + context->s
12280 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
12290 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
122a0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
122b0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
122c0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
122d0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
122e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
122f0 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
12300 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
12310 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
12320 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
12330 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12340 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
12350 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
12360 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
12370 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
12380 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
12390 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
123a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
123b0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
123c0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
123d0 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
123e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
123f0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
12400 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
12410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
12420 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
12430 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
12440 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
12450 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
12460 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
12470 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
12480 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
12490 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
124a0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
124b0 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
124c0 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
124d0 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
124e0 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
124f0 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
12500 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
12510 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
12520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12530 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
12540 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
12550 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12560 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
12570 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
12580 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12590 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
125a0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
125b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
125c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
125d0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
125e0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
125f0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12600 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12610 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12620 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12630 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
12640 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12650 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
12660 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12670 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
12680 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12690 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
126a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
126b0 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69  pCtx = (afpLocki
126c0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
126d0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
126e0 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  xt;..  assert( p
126f0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
12700 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
12710 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
12720 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
12730 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
12740 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12750 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
12760 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
12770 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
12780 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
12790 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
127a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
127b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
127c0 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
127d0 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
127e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
127f0 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69  ISUSE;.  }.  uni
12800 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
12810 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
12820 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
12830 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 69 66 28   ){.    .    if(
12840 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12850 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
12860 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 5f   ){.      rc = _
12870 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 70 43 74  AFPFSSetLock(pCt
12880 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
12890 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
128a0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
128b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
128c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
128d0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
128e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
128f0 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
12900 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
12910 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
12920 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
12930 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
12940 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74 78  HARED_FIRST+pCtx
12950 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
12960 20 20 20 20 20 20 72 63 20 3d 20 5f 41 46 50 46        rc = _AFPF
12970 53 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64  SSetLock(pCtx->d
12980 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
12990 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
129a0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
129b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
129c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
129d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  e->locktype>=PEN
129e0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
129f0 20 20 20 72 63 20 3d 20 5f 41 46 50 46 53 53 65     rc = _AFPFSSe
12a00 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
12a10 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12a20 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
12a30 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
12a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12a50 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
12a60 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
12a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 5f 41 46  {.      rc = _AF
12a80 50 46 53 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d  PFSSetLock(pCtx-
12a90 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12aa0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
12ab0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
12ac0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
12ad0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
12ae0 20 2f 2a 20 63 6c 65 61 72 20 74 68 65 20 73 68   /* clear the sh
12af0 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ared lock */.   
12b00 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
12b10 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
12b20 53 54 2b 70 43 74 78 2d 3e 73 68 61 72 65 64 42  ST+pCtx->sharedB
12b30 79 74 65 3b 0a 20 20 20 20 72 63 20 3d 20 5f 41  yte;.    rc = _A
12b40 46 50 46 53 53 65 74 4c 6f 63 6b 28 70 43 74 78  FPFSSetLock(pCtx
12b50 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
12b60 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
12b70 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69   1, 0);.  }..  i
12b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12b90 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
12ba0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
12bb0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75 6e  .      struct un
12bc0 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
12bd0 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
12be0 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
12bf0 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
12c00 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
12c10 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
12c20 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
12c30 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
12c40 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
12c50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
12c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65   for(i=0; i<pOpe
12c70 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b  n->nPending; i++
12c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12c90 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
12ca0 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e  [i] < 0 ) contin
12cb0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
12cc0 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61  ( close(pOpen->a
12cd0 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a 20  Pending[i]) ){. 
12ce0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12cf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
12d00 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
12d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12d20 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
12d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d40 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
12d50 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a  ending[i] = -1;.
12d60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12da0 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d  ite3_free(pOpen-
12db0 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
12dc0 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
12dd0 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
12de0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
12df0 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
12e00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12e10 7d 0a 20 20 7d 0a 65 6e 64 5f 61 66 70 75 6e 6c  }.  }.end_afpunl
12e20 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
12e30 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
12e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
12e50 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
12e60 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
12e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12e80 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
12e90 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
12ea0 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
12eb0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
12ec0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
12ed0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
12ee0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
12ef0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12f00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12f10 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
12f20 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
12f30 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
12f40 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
12f50 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c  e->pOpen && pFil
12f60 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  e->pOpen->nLock 
12f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
12f80 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
12f90 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
12fa0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
12fb0 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
12fc0 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
12fd0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
12fe0 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
12ff0 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
13000 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
13010 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
13020 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
13030 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
13040 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
13050 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
13060 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
13070 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
13080 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   */.      int *a
13090 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63  New;.      struc
130a0 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
130b0 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
130c0 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77 20  pen;.      aNew 
130d0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
130e0 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  c(pOpen->aPendin
130f0 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  g, (pOpen->nPend
13100 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e  ing+1)*sizeof(in
13110 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
13120 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
13130 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
13140 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
13150 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
13160 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  riptor */.      
13170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13180 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
13190 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   aNew;.        p
131a0 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
131b0 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20  Open->nPending] 
131c0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
131d0 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
131e0 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ing++;.        p
131f0 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
13200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13210 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
13220 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  File->pOpen);.  
13230 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13240 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
13250 74 65 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73 65  text);.    close
13260 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13270 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
13280 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
13290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
132a0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
132b0 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20  (__DARWIN__) && 
132c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
132d0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
132e0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
132f0 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
13300 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13310 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
13320 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
13330 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
13340 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
13350 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
13360 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
13370 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
13380 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
13390 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
133a0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
133b0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
133c0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
133d0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
133f0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
13400 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13420 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13470 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
13480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
134d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
134e0 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
134f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
13500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13510 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ****.**.**.** Th
13520 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
13530 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
13540 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
13550 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
13560 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
13570 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
13580 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
13590 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
135a0 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
135b0 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
135c0 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
135d0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
135e0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
135f0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
13600 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
13610 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
13620 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
13630 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
13640 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
13650 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
13660 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
13670 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
13680 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
13690 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
136a0 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
136b0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
136c0 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
136d0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
136e0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
136f0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
13700 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
13710 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
13720 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
13730 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
13740 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
13750 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
13760 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
13770 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
13780 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
13790 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
137a0 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
137b0 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
137c0 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
137d0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
137e0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
137f0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
13800 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a  0000000..   ..**
13810 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
13820 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
13830 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
13840 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
13850 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
13860 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
13870 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
13880 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
13890 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
138a0 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
138b0 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
138c0 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
138d0 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
138e0 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
138f0 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
13900 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
13910 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
13920 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
13930 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
13940 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
13950 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
13960 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
13970 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
13980 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
13990 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
139a0 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
139b0 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
139c0 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
139d0 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
139e0 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
139f0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
13a00 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
13a10 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
13a20 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
13a30 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
13a40 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
13a50 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
13a60 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
13a70 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
13a80 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
13a90 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
13aa0 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
13ab0 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
13ac0 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
13ad0 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
13ae0 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
13af0 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
13b00 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
13b10 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
13b20 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
13b30 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
13b40 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
13b50 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
13b60 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
13b70 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
13b80 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
13b90 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
13ba0 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
13bb0 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
13bc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
13bd0 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
13be0 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
13bf0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
13c00 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
13c10 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
13c20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
13c30 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
13c40 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
13c50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
13c60 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53  dbname, SQLITE_S
13c70 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
13c80 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
13c90 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
13ca0 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
13cb0 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
13cc0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
13cd0 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
13ce0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
13cf0 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68  LE, &<proxy_path
13d00 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
13d10 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
13d20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
13d30 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
13d40 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
13d50 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
13d60 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
13d70 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
13d80 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
13d90 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
13da0 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
13db0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
13dc0 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
13dd0 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
13de0 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
13df0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
13e00 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
13e10 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
13e20 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
13e30 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
13e40 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
13e50 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
13e60 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
13e70 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
13e80 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
13e90 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
13ea0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
13eb0 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
13ec0 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
13ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13ee0 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
13ef0 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
13f00 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
13f10 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
13f20 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
13f30 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
13f40 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
13f50 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
13f60 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
13f70 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
13f80 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
13f90 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
13fa0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
13fb0 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
13fc0 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
13fd0 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
13fe0 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
13ff0 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
14000 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
14010 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
14020 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
14030 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
14040 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
14050 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
14060 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
14070 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
14080 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
14090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140a0 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
140b0 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
140c0 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
140d0 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
140e0 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
140f0 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
14100 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
14110 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14120 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
14130 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
14140 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
14150 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
14160 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
14170 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
14180 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
14190 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
141a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
141b0 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
141c0 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
141d0 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
141e0 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
141f0 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
14200 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
14210 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
14220 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
14230 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
14240 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
14250 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
14260 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
14270 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
14280 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
14290 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
142a0 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
142b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
142c0 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
142d0 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
142e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
142f0 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
14300 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14310 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
14320 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
14330 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
14340 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
14350 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
14360 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
14370 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
14380 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
14390 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  t's contents do 
143a0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
143b0 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
143c0 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
143d0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
143e0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
143f0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
14400 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
14410 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
14420 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
14430 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
14440 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
14450 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
14460 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
14470 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
14480 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
14490 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
144a0 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
144b0 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
144c0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
144d0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
144e0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
144f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
14500 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
14510 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
14520 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
14530 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
14540 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
14550 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
14560 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
14570 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
14580 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
14590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
145a0 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
145b0 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
145c0 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
145d0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
145e0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
145f0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
14600 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
14610 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
14620 54 68 65 72 65 20 69 73 20 61 20 74 68 69 72 64  There is a third
14630 20 66 69 6c 65 20 2d 20 74 68 65 20 68 6f 73 74   file - the host
14640 20 49 44 20 66 69 6c 65 20 2d 20 75 73 65 64 20   ID file - used 
14650 61 73 20 61 20 70 65 72 73 69 73 74 65 6e 74 20  as a persistent 
14660 72 65 63 6f 72 64 0a 2a 2a 20 6f 66 20 61 20 75  record.** of a u
14670 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72  nique identifier
14680 20 66 6f 72 20 74 68 65 20 68 6f 73 74 2c 20 61   for the host, a
14690 20 31 32 38 2d 62 79 74 65 20 75 6e 69 71 75 65   128-byte unique
146a0 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
146b0 20 69 6e 20 74 68 65 20 70 61 74 68 20 64 65 66   in the path def
146c0 69 6e 65 64 20 62 79 20 74 68 65 20 48 4f 53 54  ined by the HOST
146d0 49 44 50 41 54 48 20 6d 61 63 72 6f 20 28 64 65  IDPATH macro (de
146e0 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 0a 2a  fault value is.*
146f0 2a 20 2f 4c 69 62 72 61 72 79 2f 43 61 63 68 65  * /Library/Cache
14700 73 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c  s/.com.apple.sql
14710 69 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 29 2e  iteConchHostId).
14720 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
14730 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
14740 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
14750 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
14760 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
14770 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
14780 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
14790 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
147a0 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
147b0 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
147c0 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
147d0 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
147e0 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
147f0 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
14800 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
14810 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
14820 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
14830 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
14840 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
14850 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
14860 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14870 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
14880 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
14890 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
148a0 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
148b0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
148c0 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
148d0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
148e0 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
148f0 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
14900 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
14910 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
14920 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
14930 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
14940 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14960 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
14970 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
14980 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
14990 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
149a0 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
149b0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
149c0 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
149d0 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
149e0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
149f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
14a00 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
14a10 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
14a20 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
14a30 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
14a40 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
14a50 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
14a60 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
14a70 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
14a80 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
14a90 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
14aa0 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
14ab0 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
14ac0 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
14ad0 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
14ae0 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
14af0 2a 0a 2a 2a 20 20 48 4f 53 54 49 44 50 41 54 48  *.**  HOSTIDPATH
14b00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
14b10 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
14b20 6c 74 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  lt host ID file 
14b30 70 61 74 68 20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  path location.**
14b40 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
14b50 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
14b60 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
14b70 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
14b80 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
14b90 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
14ba0 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
14bb0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
14bc0 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
14bd0 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
14be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
14bf0 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
14c00 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
14c10 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
14c20 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14c30 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
14c40 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
14c50 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
14c60 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
14c70 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
14c80 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
14c90 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
14ca0 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
14cb0 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
14cc0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
14cd0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
14ce0 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
14cf0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
14d00 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
14d10 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
14d20 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
14d30 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
14d40 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
14d50 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
14d60 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
14d70 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
14d80 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
14d90 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
14da0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
14db0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
14dc0 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
14dd0 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
14de0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
14df0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
14e00 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
14e10 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
14e20 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
14e30 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
14e40 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
14e50 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
14e60 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
14e70 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
14e80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41  #if defined(__DA
14e90 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54  RWIN__) && SQLIT
14ea0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14eb0 5f 53 54 59 4c 45 0a 0a 0a 73 74 61 74 69 63 20  _STYLE...static 
14ec0 69 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f 72  int getDbPathFor
14ed0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
14ee0 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a  e *pFile, char *
14ef0 64 62 50 61 74 68 29 3b 0a 73 74 61 74 69 63 20  dbPath);.static 
14f00 69 6e 74 20 67 65 74 4c 6f 63 6b 50 61 74 68 28  int getLockPath(
14f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
14f20 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
14f30 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 3b   size_t maxLen);
14f40 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
14f50 74 65 50 72 6f 78 79 55 6e 69 78 46 69 6c 65 28  teProxyUnixFile(
14f60 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
14f70 2c 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46  , unixFile **ppF
14f80 69 6c 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ile);.static int
14f90 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
14fa0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14fb0 73 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 64 69  s, int h, int di
14fc0 72 66 64 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  rfd, sqlite3_fil
14fd0 65 20 2a 70 49 64 2c 20 63 6f 6e 73 74 20 63 68  e *pId, const ch
14fe0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
14ff0 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 69 6e 74 20 69  nt noLock, int i
15000 73 44 65 6c 65 74 65 29 3b 0a 73 74 61 74 69 63  sDelete);.static
15010 20 69 6e 74 20 74 61 6b 65 43 6f 6e 63 68 28 75   int takeConch(u
15020 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 3b  nixFile *pFile);
15030 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 65  .static int rele
15040 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  aseConch(unixFil
15050 65 20 2a 70 46 69 6c 65 29 3b 0a 73 74 61 74 69  e *pFile);.stati
15060 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
15070 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
15080 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
15090 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
150a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
150b0 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20  EST./* simulate 
150c0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
150d0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
150e0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
150f0 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ths */.int sqlit
15100 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20  e3_hostid_num = 
15110 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
15120 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
15130 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
15140 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
15150 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
15160 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
15170 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
15180 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
15190 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
151a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
151b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
151c0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
151d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
151e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
151f0 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a  chFile;.  char *
15200 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
15210 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
15220 72 6f 78 79 3b 0a 20 20 63 68 61 72 20 2a 6c 6f  roxy;.  char *lo
15230 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 63  ckProxyPath;.  c
15240 68 61 72 20 2a 64 62 50 61 74 68 3b 0a 20 20 69  har *dbPath;.  i
15250 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 0a 20 20  nt conchHeld;.  
15260 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
15270 43 6f 6e 74 65 78 74 3b 20 2f 2a 20 70 72 65 73  Context; /* pres
15280 65 72 76 65 20 74 68 65 20 6f 72 69 67 69 6e 61  erve the origina
15290 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
152a0 74 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 20  t for close */. 
152b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
152c0 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
152d0 65 74 68 6f 64 3b 20 2f 2a 20 64 69 74 74 6f 20  ethod; /* ditto 
152e0 70 4d 65 74 68 6f 64 20 2a 2f 0a 7d 3b 0a 0a 0a  pMethod */.};...
152f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
15300 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15310 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15320 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15330 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
15340 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15350 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
15360 3d 20 74 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  = takeConch(pFil
15370 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
15380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
15390 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
153a0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
153b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
153c0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
153d0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
153e0 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
153f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
15400 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
15410 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
15420 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
15440 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
15450 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15460 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ..static int pro
15470 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
15480 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
15490 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
154a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
154b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
154c0 74 20 72 63 20 3d 20 74 61 6b 65 43 6f 6e 63 68  t rc = takeConch
154d0 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
154e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
154f0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
15500 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
15510 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
15520 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
15530 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
15540 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
15550 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
15560 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  oxy;.    rc = pr
15570 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  oxy->pMethod->xL
15580 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
15590 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79  e*)proxy, lockty
155a0 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  pe);.    pFile->
155b0 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
155c0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  ->locktype;.  }.
155d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
155e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
155f0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15600 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
15610 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
15620 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15630 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
15640 74 20 72 63 20 3d 20 74 61 6b 65 43 6f 6e 63 68  t rc = takeConch
15650 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
15660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15670 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
15680 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
15690 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
156a0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
156b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
156c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
156d0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
156e0 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  oxy;.    rc = pr
156f0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
15700 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
15710 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b  ile*)proxy, lock
15720 74 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65  type);.    pFile
15730 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f  ->locktype = pro
15740 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  xy->locktype;.  
15750 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15760 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
15770 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
15780 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
15790 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
157a0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
157b0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
157c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
157d0 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c  *)id;.    proxyL
157e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
157f0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
15800 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
15810 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15820 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
15830 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
15840 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
15850 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
15860 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
15870 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e  onchFile;.    in
15880 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15890 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c  ;.    .    if( l
158a0 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
158b0 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
158c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
158d0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
158e0 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f  *)lockProxy, NO_
158f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
15900 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15910 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
15920 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
15930 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
15940 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  file*)lockProxy)
15950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
15960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
15980 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
15990 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
159a0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
159b0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
159c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
159d0 72 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69  releaseConch(pFi
159e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
159f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15a10 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
15a20 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
15a30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
15a40 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
15a50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15a60 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
15a70 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65  3_free(conchFile
15a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15a90 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
15aa0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
15ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15ac0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
15ad0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
15ae0 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64 62  e3_free(pCtx->db
15af0 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65  Path);.    /* re
15b00 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e  store the origin
15b10 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  al locking conte
15b20 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
15b30 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a  hen close it */.
15b40 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
15b50 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
15b60 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
15b70 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
15b80 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e  pMethod = pCtx->
15b90 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20  pOldMethod;.    
15ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
15bb0 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  x);.    return p
15bc0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
15bd0 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20  Close(id);.  }. 
15be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15bf0 4b 3b 0a 7d 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c  K;.}../* HOSTIDL
15c00 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20  EN and CONCHLEN 
15c10 62 6f 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61  both include spa
15c20 63 65 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e  ce for the strin
15c30 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e  g .** terminatin
15c40 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e  g nul .*/.#defin
15c50 65 20 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20  e HOSTIDLEN     
15c60 20 20 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20      128.#define 
15c70 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20  CONCHLEN        
15c80 20 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f    (MAXPATHLEN+HO
15c90 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64  STIDLEN+1).#ifnd
15ca0 65 66 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20  ef HOSTIDPATH.# 
15cb0 64 65 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54  define HOSTIDPAT
15cc0 48 20 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72  H       "/Librar
15cd0 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70  y/Caches/.com.ap
15ce0 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48  ple.sqliteConchH
15cf0 6f 73 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f  ostId".#endif../
15d00 2a 20 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f  * basically a co
15d10 70 79 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d  py of unixRandom
15d20 6e 65 73 73 20 77 69 74 68 20 64 69 66 66 65 72  ness with differ
15d30 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61  ent.** test beha
15d40 76 69 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f  vior built in */
15d50 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 48  .static int genH
15d60 6f 73 74 49 44 28 63 68 61 72 20 2a 70 48 6f 73  ostID(char *pHos
15d70 74 49 44 29 7b 0a 20 20 69 6e 74 20 70 69 64 2c  tID){.  int pid,
15d80 20 66 64 2c 20 69 2c 20 6c 65 6e 3b 0a 20 20 75   fd, i, len;.  u
15d90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
15da0 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  y = (unsigned ch
15db0 61 72 20 2a 29 70 48 6f 73 74 49 44 3b 0a 20 20  ar *)pHostID;.  
15dc0 0a 20 20 6d 65 6d 73 65 74 28 6b 65 79 2c 20 30  .  memset(key, 0
15dd0 2c 20 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  , HOSTIDLEN);.  
15de0 6c 65 6e 20 3d 20 30 3b 0a 20 20 66 64 20 3d 20  len = 0;.  fd = 
15df0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
15e00 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
15e10 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
15e20 20 20 20 6c 65 6e 20 3d 20 72 65 61 64 28 66 64     len = read(fd
15e30 2c 20 6b 65 79 2c 20 48 4f 53 54 49 44 4c 45 4e  , key, HOSTIDLEN
15e40 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29  );.    close(fd)
15e50 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
15e60 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20  ak the fd if it 
15e70 66 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a 20 20 69  fails */.  }.  i
15e80 66 28 20 6c 65 6e 20 3c 20 48 4f 53 54 49 44 4c  f( len < HOSTIDL
15e90 45 4e 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f 74  EN ){.    time_t
15ea0 20 74 3b 0a 20 20 20 20 74 69 6d 65 28 26 74 29   t;.    time(&t)
15eb0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6b 65 79  ;.    memcpy(key
15ec0 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
15ed0 3b 0a 20 20 20 20 70 69 64 20 3d 20 67 65 74 70  ;.    pid = getp
15ee0 69 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  id();.    memcpy
15ef0 28 26 6b 65 79 5b 73 69 7a 65 6f 66 28 74 29 5d  (&key[sizeof(t)]
15f00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
15f10 69 64 29 29 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  id));.  }.  .#if
15f20 64 65 66 20 4d 41 4b 45 5f 50 52 45 54 54 59 5f  def MAKE_PRETTY_
15f30 48 4f 53 54 49 44 0a 20 20 2f 2a 20 66 69 6c 74  HOSTID.  /* filt
15f40 65 72 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  er the bytes int
15f50 6f 20 70 72 69 6e 74 61 62 6c 65 20 61 73 63 69  o printable asci
15f60 69 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64  i characters and
15f70 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 65 20 2a   NUL terminate *
15f80 2f 0a 20 20 6b 65 79 5b 28 48 4f 53 54 49 44 4c  /.  key[(HOSTIDL
15f90 45 4e 2d 31 29 5d 20 3d 20 30 78 30 30 3b 0a 20  EN-1)] = 0x00;. 
15fa0 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 28 48 4f   for( i=0; i<(HO
15fb0 53 54 49 44 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20  STIDLEN-1); i++ 
15fc0 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
15fd0 63 68 61 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d  char pa = key[i]
15fe0 26 30 78 37 46 3b 0a 20 20 20 20 69 66 28 20 70  &0x7F;.    if( p
15ff0 61 3c 30 78 32 30 20 29 7b 0a 20 20 20 20 20 20  a<0x20 ){.      
16000 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b 69 5d  key[i] = (key[i]
16010 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29 20 3f  &0x80 == 0x80) ?
16020 20 70 61 2b 30 78 34 30 20 3a 20 70 61 2b 30 78   pa+0x40 : pa+0x
16030 32 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  20;.    }else if
16040 28 20 70 61 3d 3d 30 78 37 46 20 29 7b 0a 20 20  ( pa==0x7F ){.  
16050 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65      key[i] = (ke
16060 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38  y[i]&0x80 == 0x8
16070 30 29 20 3f 20 70 61 3d 30 78 32 30 20 3a 20 70  0) ? pa=0x20 : p
16080 61 2b 30 78 37 45 3b 0a 20 20 20 20 7d 0a 20 20  a+0x7E;.    }.  
16090 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
160a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
160b0 2f 2a 20 77 72 69 74 65 73 20 74 68 65 20 68 6f  /* writes the ho
160c0 73 74 20 69 64 20 70 61 74 68 20 74 6f 20 70 61  st id path to pa
160d0 74 68 2c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  th, path should 
160e0 62 65 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61  be an pre-alloca
160f0 74 65 64 20 62 75 66 66 65 72 0a 2a 2a 20 77 69  ted buffer.** wi
16100 74 68 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  th enough space 
16110 66 6f 72 20 61 20 70 61 74 68 20 2a 2f 0a 73 74  for a path */.st
16120 61 74 69 63 20 69 6e 74 20 67 65 74 48 6f 73 74  atic int getHost
16130 49 44 50 61 74 68 28 63 68 61 72 20 2a 70 61 74  IDPath(char *pat
16140 68 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a  h, size_t len){.
16150 20 20 73 74 72 6c 63 70 79 28 70 61 74 68 2c 20    strlcpy(path, 
16160 48 4f 53 54 49 44 50 41 54 48 2c 20 6c 65 6e 29  HOSTIDPATH, len)
16170 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16180 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
16190 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3e 30 20  e3_hostid_num>0 
161a0 29 7b 0a 20 20 20 20 63 68 61 72 20 73 75 66 66  ){.    char suff
161b0 69 78 5b 32 5d 20 3d 20 22 31 22 3b 0a 20 20 20  ix[2] = "1";.   
161c0 20 73 75 66 66 69 78 5b 30 5d 20 3d 20 73 75 66   suffix[0] = suf
161d0 66 69 78 5b 30 5d 20 2b 20 73 71 6c 69 74 65 33  fix[0] + sqlite3
161e0 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 20 20 20  _hostid_num;.   
161f0 20 73 74 72 6c 63 61 74 28 70 61 74 68 2c 20 73   strlcat(path, s
16200 75 66 66 69 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d  uffix, len);.  }
16210 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
16220 45 33 28 22 47 45 54 48 4f 53 54 49 44 50 41 54  E3("GETHOSTIDPAT
16230 48 20 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  H  %s pid=%d\n",
16240 20 70 61 74 68 2c 20 67 65 74 70 69 64 28 29 29   path, getpid())
16250 3b 0a 7d 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  ;.}../* get the 
16260 68 6f 73 74 20 49 44 20 66 72 6f 6d 20 61 20 73  host ID from a s
16270 71 6c 69 74 65 20 68 6f 73 74 69 64 20 66 69 6c  qlite hostid fil
16280 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
16290 0a 2a 2a 20 75 73 65 72 2d 73 70 65 63 69 66 69  .** user-specifi
162a0 63 20 74 6d 70 20 64 69 72 65 63 74 6f 72 79 2c  c tmp directory,
162b0 20 63 72 65 61 74 65 20 74 68 65 20 49 44 20 69   create the ID i
162c0 66 20 69 74 27 73 20 6e 6f 74 20 74 68 65 72 65  f it's not there
162d0 20 61 6c 72 65 61 64 79 20 0a 2a 2f 0a 73 74 61   already .*/.sta
162e0 74 69 63 20 69 6e 74 20 67 65 74 48 6f 73 74 49  tic int getHostI
162f0 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  D(char *pHostID,
16300 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
16310 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
16320 70 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  path[MAXPATHLEN]
16330 3b 20 0a 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b  ; .  size_t len;
16340 0a 09 69 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f  ..int rc=SQLITE_
16350 4f 4b 3b 0a 0a 20 20 67 65 74 48 6f 73 74 49 44  OK;..  getHostID
16360 50 61 74 68 28 70 61 74 68 2c 20 4d 41 58 50 41  Path(path, MAXPA
16370 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79  THLEN);.  /* try
16380 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 68   to create the h
16390 6f 73 74 20 49 44 20 66 69 6c 65 2c 20 69 66 20  ost ID file, if 
163a0 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
163b0 73 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  s read the conte
163c0 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  nts */.  fd = op
163d0 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45 41 54  en(path, O_CREAT
163e0 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c  |O_WRONLY|O_EXCL
163f0 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28 20 66  , 0644);.  if( f
16400 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  d<0 ){.    int e
16410 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20  rr=errno;....   
16420 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
16430 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
16440 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a  E_PROXY_DEBUG /*
16450 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20   set the sqlite 
16460 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
16470 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66  stead */.      f
16480 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16490 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 72 65  sqlite error cre
164a0 61 74 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69  ating host ID fi
164b0 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20  le %s: %s\n",.  
164c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
164d0 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29  , strerror(err))
164e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
164f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
16500 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  M;.    }.    /* 
16510 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
16520 74 68 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69  the file, read i
16530 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20  t instead */.   
16540 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
16550 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c   O_RDONLY|O_EXCL
16560 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
16570 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
16580 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66   = errno;.#ifdef
16590 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
165a0 42 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20 73  BUG /* set the s
165b0 71 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  qlite error mess
165c0 61 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20  age instead */. 
165d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
165e0 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72  err, "sqlite err
165f0 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20  or opening host 
16600 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e  ID file %s: %s\n
16610 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16620 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28   path, strerror(
16630 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  err));.#endif.  
16640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16650 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20  E_PERM;.    }.  
16660 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 66 64    len = pread(fd
16670 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49  , pHostID, HOSTI
16680 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  DLEN, 0);.    if
16690 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
166a0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f   *pError = errno
166b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
166c0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
166d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
166e0 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  n<HOSTIDLEN ){. 
166f0 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30       *pError = 0
16700 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
16710 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
16720 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  READ;.    }.    
16730 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
16740 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20  lently leak the 
16750 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a  fd if it fails *
16760 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  /.    OSTRACE3("
16770 47 45 54 48 4f 53 54 49 44 20 20 72 65 61 64 20  GETHOSTID  read 
16780 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48  %s pid=%d\n", pH
16790 6f 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29  ostID, getpid())
167a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
167b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
167c0 74 20 69 3b 0a 20 20 20 20 2f 2a 20 77 65 27 72  t i;.    /* we'r
167d0 65 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 68  e creating the h
167e0 6f 73 74 20 49 44 20 66 69 6c 65 20 28 75 73 65  ost ID file (use
167f0 20 61 20 72 61 6e 64 6f 6d 20 73 74 72 69 6e 67   a random string
16800 20 6f 66 20 62 79 74 65 73 29 20 2a 2f 0a 20 20   of bytes) */.  
16810 20 20 67 65 6e 48 6f 73 74 49 44 28 70 48 6f 73    genHostID(pHos
16820 74 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  tID);.    len = 
16830 70 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73 74  pwrite(fd, pHost
16840 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30  ID, HOSTIDLEN, 0
16850 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30  );.    if( len<0
16860 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
16870 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
16880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16890 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
168a0 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54  lse if( len<HOST
168b0 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a  IDLEN ){.      *
168c0 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
168d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
168e0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
168f0 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20  .    close(fd); 
16900 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
16910 20 74 68 65 20 66 64 20 69 66 20 69 74 20 66 61   the fd if it fa
16920 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41  ils */.    OSTRA
16930 43 45 33 28 22 47 45 54 48 4f 53 54 49 44 20 20  CE3("GETHOSTID  
16940 77 72 6f 74 65 20 25 73 20 70 69 64 3d 25 64 5c  wrote %s pid=%d\
16950 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65 74  n", pHostID, get
16960 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74 75  pid());.    retu
16970 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
16980 20 74 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68   takes the conch
16990 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61   by taking a sha
169a0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61  red lock and rea
169b0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  d the contents c
169c0 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63  onch, if .** loc
169d0 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c  kPath is non-NUL
169e0 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  L, the host ID a
169f0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
16a00 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41  h must match.  A
16a10 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61   NULL .** lockPa
16a20 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  th means that th
16a30 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68  e lockPath in th
16a40 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
16a50 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  l be used if the
16a60 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61   .** host IDs ma
16a70 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f  tch, or a new lo
16a80 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
16a90 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
16aa0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20  tically .** and 
16ab0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
16ac0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  onch file..*/.st
16ad0 61 74 69 63 20 69 6e 74 20 74 61 6b 65 43 6f 6e  atic int takeCon
16ae0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
16af0 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
16b00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
16b10 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
16b20 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
16b30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
16b40 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
16b50 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
16b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16b70 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
16b80 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
16b90 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
16ba0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 63 68  onchFile;.    ch
16bb0 61 72 20 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e  ar testValue[CON
16bc0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
16bd0 20 63 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43   conchValue[CONC
16be0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
16bf0 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
16c00 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
16c10 74 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  tLockPath = NULL
16c20 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
16c30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
16c40 74 20 72 65 61 64 52 63 20 3d 20 53 51 4c 49 54  t readRc = SQLIT
16c50 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79  E_OK;.    int sy
16c60 6e 63 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20  ncPerms = 0;..  
16c70 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45    OSTRACE4("TAKE
16c80 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
16c90 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
16ca0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
16cb0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
16cc0 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
16cd0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
16ce0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
16cf0 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72  etpid());..    r
16d00 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
16d10 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
16d20 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
16d30 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
16d40 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
16d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 09  ==SQLITE_OK ){..
16d60 09 09 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30  ..int pError = 0
16d70 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 74  ;.      memset(t
16d80 65 73 74 56 61 6c 75 65 2c 20 30 2c 20 43 4f 4e  estValue, 0, CON
16d90 43 48 4c 45 4e 29 3b 20 2f 2f 20 63 6f 6e 63 68  CHLEN); // conch
16da0 20 69 73 20 66 69 78 65 64 20 73 69 7a 65 0a 20   is fixed size. 
16db0 20 20 20 20 20 72 63 20 3d 20 67 65 74 48 6f 73       rc = getHos
16dc0 74 49 44 28 74 65 73 74 56 61 6c 75 65 2c 20 26  tID(testValue, &
16dd0 70 45 72 72 6f 72 29 3b 0a 09 09 09 69 66 28 20  pError);....if( 
16de0 72 63 26 53 51 4c 49 54 45 5f 49 4f 45 52 52 3d  rc&SQLITE_IOERR=
16df0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
16e00 0a 09 09 09 09 70 46 69 6c 65 2d 3e 6c 61 73 74  .....pFile->last
16e10 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
16e20 09 09 09 7d 0a 20 20 20 20 20 20 69 66 28 20 70  ...}.      if( p
16e30 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
16e40 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  th ){.        st
16e50 72 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65  rlcpy(&testValue
16e60 5b 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74  [HOSTIDLEN], pCt
16e70 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
16e80 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
16e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16ea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
16ec0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
16ed0 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72      }.    .    r
16ee0 65 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64  eadRc = unixRead
16ef0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
16f00 29 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63  )conchFile, conc
16f10 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e  hValue, CONCHLEN
16f20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
16f30 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  adRc!=SQLITE_IOE
16f40 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
16f50 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 74 63 68  .      int match
16f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
16f70 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 4f  readRc!=SQLITE_O
16f80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
16f90 20 72 63 26 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc&SQLITE_IOERR
16fa0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
16fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
16fc0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63  e->lastErrno = c
16fd0 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72  onchFile->lastEr
16fe0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
16ff0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
17000 52 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  Rc;.        goto
17010 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
17020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
17030 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61   if the conch ha
17040 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74  s data compare t
17050 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
17060 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
17070 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
17080 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20  .        /* for 
17090 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
170a0 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
170b0 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
170c0 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
170d0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
170e0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
170f0 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
17100 65 61 64 79 20 69 6e 20 74 68 65 72 65 20 2a 2f  eady in there */
17110 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65  .        if( !me
17120 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20  mcmp(testValue, 
17130 63 6f 6e 63 68 56 61 6c 75 65 2c 20 48 4f 53 54  conchValue, HOST
17140 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
17150 20 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20      tLockPath = 
17160 28 63 68 61 72 20 2a 29 26 63 6f 6e 63 68 56 61  (char *)&conchVa
17170 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a  lue[HOSTIDLEN];.
17180 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
17190 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
171a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
171b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
171c0 77 65 27 76 65 20 67 6f 74 20 74 68 65 20 63 6f  we've got the co
171d0 6e 63 68 20 69 66 20 63 6f 6e 63 68 56 61 6c 75  nch if conchValu
171e0 65 20 6d 61 74 63 68 65 73 20 6f 75 72 20 70 61  e matches our pa
171f0 74 68 20 61 6e 64 20 68 6f 73 74 20 49 44 20 2a  th and host ID *
17200 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d  /.        if( !m
17210 65 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c  emcmp(testValue,
17220 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e   conchValue, CON
17230 43 48 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  CHLEN) ){.      
17240 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
17250 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
17260 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
17270 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  lse{.      /* a 
17280 73 68 6f 72 74 20 72 65 61 64 20 6d 65 61 6e 73  short read means
17290 20 77 65 27 72 65 20 22 63 72 65 61 74 69 6e 67   we're "creating
172a0 22 20 74 68 65 20 63 6f 6e 63 68 20 28 65 76 65  " the conch (eve
172b0 6e 20 74 68 6f 75 67 68 20 69 74 20 63 6f 75 6c  n though it coul
172c0 64 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  d .      ** have
172d0 20 62 65 65 6e 20 75 73 65 72 2d 69 6e 74 65 72   been user-inter
172e0 76 65 6e 74 69 6f 6e 29 2c 20 69 66 20 77 65 20  vention), if we 
172f0 61 63 71 75 69 72 65 20 74 68 65 20 65 78 63 6c  acquire the excl
17300 75 73 69 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20  usive lock,.    
17310 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
17320 6f 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72  o match the curr
17330 65 6e 74 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d  ent on-disk perm
17340 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
17350 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2f  atabase.      */
17360 0a 20 20 20 20 20 20 73 79 6e 63 50 65 72 6d 73  .      syncPerms
17370 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17380 0a 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 63  .    /* either c
17390 6f 6e 63 68 20 77 61 73 20 65 6d 74 70 79 20 6f  onch was emtpy o
173a0 72 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 2a  r didn't match *
173b0 2f 0a 20 20 20 20 69 66 28 20 21 70 43 74 78 2d  /.    if( !pCtx-
173c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
173d0 7b 0a 20 20 20 20 20 20 67 65 74 4c 6f 63 6b 50  {.      getLockP
173e0 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ath(pCtx->dbPath
173f0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  , lockPath, MAXP
17400 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 74  ATHLEN);.      t
17410 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
17420 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72 6c 63  ath;.      strlc
17430 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48 4f  py(&testValue[HO
17440 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50 61  STIDLEN], lockPa
17450 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
17460 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
17470 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
17480 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
17490 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
174a0 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
174b0 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61 73 20  ess.     ** has 
174c0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
174d0 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20 72 63  ready) */.    rc
174e0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
174f0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
17500 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
17510 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
17520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
17530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17540 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
17550 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
17560 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
17570 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f 4e 43   testValue, CONC
17580 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
17590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
175a0 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73 20 29  K && syncPerms )
175b0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
175c0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
175d0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74     int err = fst
175e0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
175f0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
17600 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
17610 20 20 20 20 6d 6f 64 65 5f 74 20 6d 6f 64 65 20      mode_t mode 
17620 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  = buf.st_mode & 
17630 30 31 30 30 36 36 36 3b 0a 20 20 20 20 20 20 20  0100666;.       
17640 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
17650 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
17660 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  file permissions
17670 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
17680 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
17690 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
176a0 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28           fchmod(
176b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
176c0 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23 65 6c 73  f.st_mode);.#els
176d0 65 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  e.          if( 
176e0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
176f0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65  ->h, buf.st_mode
17700 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
17710 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
17720 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
17730 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17740 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
17750 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
17760 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20 63 6f 64  buf.st_mode, cod
17790 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
177a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ));.          } 
177b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
177c0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
177d0 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
177e0 43 43 45 44 45 44 5c 6e 22 2c 62 75 66 2e 73 74  CCEDED\n",buf.st
177f0 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  _mode);.        
17800 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
17810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
17820 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
17830 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
17840 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46  (stderr, "STAT F
17850 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25  AILED[%d] with %
17860 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  d %s\n", .      
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73      err, code, s
17890 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
178a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
178b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
178c0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
178d0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
178e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
178f0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
17900 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64 5f 74 61  LOCK);.  .end_ta
17910 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 4f 53 54  keconch:.    OST
17920 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58  RACE2("TRANSPROX
17930 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
17940 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
17950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17960 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
17970 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 69  Flags ){.      i
17980 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
17990 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54 5f  {.#ifdef STRICT_
179a0 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20  CLOSE_ERROR.    
179b0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46      if( close(pF
179c0 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20  ile->h) ){.     
179d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
179e0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
179f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17a00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
17a10 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  SE;.        }.#e
17a20 6c 73 65 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  lse.        clos
17a30 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20  e(pFile->h); /* 
17a40 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
17a50 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64   if fail */.#end
17a60 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
17a70 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
17a80 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f        int fd = o
17a90 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
17aa0 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
17ab0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
17ac0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
17ad0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
17ae0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
17af0 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50  OSTRACE2("TRANSP
17b00 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e  ROXY: OPEN  %d\n
17b10 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ", fd);.      if
17b20 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
17b30 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
17b40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17b50 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
17b60 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2f 20 53 51  _CANTOPEN; // SQ
17b70 4c 49 54 45 5f 42 55 53 59 3f 20 74 61 6b 65 43  LITE_BUSY? takeC
17b80 6f 6e 63 68 20 63 61 6c 6c 65 64 20 64 75 72 69  onch called duri
17b90 6e 67 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  ng locking.     
17ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17bb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17bc0 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
17bd0 78 79 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  xy ){.      char
17be0 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63 6b 50 61   *path = tLockPa
17bf0 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74 68 20 3a  th ? tLockPath :
17c00 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
17c10 50 61 74 68 3b 0a 20 20 20 20 20 20 2f 2f 20 41  Path;.      // A
17c20 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65  CS: Need to make
17c30 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
17c40 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20  sometimes.      
17c50 72 63 20 3d 20 63 72 65 61 74 65 50 72 6f 78 79  rc = createProxy
17c60 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26  UnixFile(path, &
17c70 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29  pCtx->lockProxy)
17c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17ca0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
17cb0 63 68 48 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20  chHeld = 1;..   
17cc0 20 20 20 69 66 28 20 74 4c 6f 63 6b 50 61 74 68     if( tLockPath
17cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
17ce0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
17cf0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
17d00 70 28 30 2c 20 74 4c 6f 63 6b 50 61 74 68 29 3b  p(0, tLockPath);
17d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
17d20 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d  x->lockProxy->pM
17d30 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
17d40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
17d50 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67      ((afpLocking
17d60 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e  Context *)pCtx->
17d70 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69  lockProxy->locki
17d80 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
17d90 74 68 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  th =.           
17da0 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
17db0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
17dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17dd0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
17de0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
17df0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
17e00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
17e10 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
17e20 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53  K);.    }.    OS
17e30 54 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e 43  TRACE3("TAKECONC
17e40 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
17e50 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53  chFile->h, rc==S
17e60 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66  QLITE_OK?"ok":"f
17e70 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ailed");.    ret
17e80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 20 20  urn rc;.  }.}.  
17e90 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 65  .static int rele
17ea0 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  aseConch(unixFil
17eb0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
17ec0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
17ed0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
17ee0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
17ef0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17f00 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
17f10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
17f20 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
17f30 6f 6e 63 68 46 69 6c 65 3b 0a 0a 20 20 4f 53 54  onchFile;..  OST
17f40 52 41 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f  RACE4("RELEASECO
17f50 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
17f60 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
17f70 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
17f80 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
17f90 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
17fa0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
17fb0 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
17fc0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
17fd0 3b 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  ;.  pCtx->conchH
17fe0 65 6c 64 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  eld = 0;.  rc = 
17ff0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
18000 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
18010 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
18020 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
18030 20 20 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45    OSTRACE3("RELE
18040 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
18050 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
18060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
18070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
18080 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
18090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
180a0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 43  .static int getC
180b0 6f 6e 63 68 50 61 74 68 46 72 6f 6d 44 42 50 61  onchPathFromDBPa
180c0 74 68 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  th(char *dbPath,
180d0 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
180e0 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  th){.  int i;.  
180f0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
18100 28 64 62 50 61 74 68 29 3b 0a 20 20 63 68 61 72  (dbPath);.  char
18110 20 2a 63 6f 6e 63 68 50 61 74 68 3b 0a 20 20 0a   *conchPath;.  .
18120 20 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63    conchPath = (c
18130 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
18140 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
18150 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
18160 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18170 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18180 7d 0a 20 20 73 74 72 6c 63 70 79 28 63 6f 6e 63  }.  strlcpy(conc
18190 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c  hPath, dbPath, l
181a0 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  en+1);.  .  /* n
181b0 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20  ow insert a "." 
181c0 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
181d0 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  / character */. 
181e0 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b   for( i=(len-1);
181f0 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20   i>=0; i-- ){.  
18200 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b    if( conchPath[
18210 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
18220 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61   i++;.      brea
18230 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  k;.    }.  }.  c
18240 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b  onchPath[i]='.';
18250 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e  .  while ( i<len
18260 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74   ){.    conchPat
18270 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d  h[i+1]=dbPath[i]
18280 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
18290 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
182a0 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
182b0 63 6f 6e 63 68 50 61 74 68 2c 20 22 2d 63 6f 6e  conchPath, "-con
182c0 63 68 22 2c 20 6c 65 6e 20 2b 20 38 29 3b 0a 20  ch", len + 8);. 
182d0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
182e0 6f 6e 63 68 50 61 74 68 3b 0a 20 20 72 65 74 75  onchPath;.  retu
182f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18300 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  ..static int get
18310 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
18320 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
18330 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
18340 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
18350 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
18360 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
18370 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
18380 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
18390 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
183a0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
183b0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
183c0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
183d0 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 63 68 61  _DIR.  {.    cha
183e0 72 20 75 74 64 69 72 5b 4d 41 58 50 41 54 48 4c  r utdir[MAXPATHL
183f0 45 4e 5d 3b 0a 20 20 20 20 0a 20 20 20 20 63 6f  EN];.    .    co
18400 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
18410 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
18420 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b 0a  lPath, maxLen);.
18430 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
18440 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
18450 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
18460 3b 0a 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28  ;.    if( mkdir(
18470 6c 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 44 45  lPath, SQLITE_DE
18480 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
18490 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
184a0 20 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69 72       /* if mkdir
184b0 20 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20 61   fails, handle a
184c0 73 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65 61  s lock file crea
184d0 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  tion failure */.
184e0 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
184f0 65 72 72 6e 6f 3b 0a 23 20 20 69 66 64 65 66 20  errno;.#  ifdef 
18500 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
18510 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
18520 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ST ){.        fp
18530 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 67  rintf(stderr, "g
18540 65 74 4c 6f 63 6b 50 61 74 68 3a 20 6d 6b 64 69  etLockPath: mkdi
18550 72 28 25 73 2c 30 25 6f 29 20 65 72 72 6f 72 20  r(%s,0%o) error 
18560 25 64 20 25 73 5c 6e 22 2c 20 6c 50 61 74 68 2c  %d %s\n", lPath,
18570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18590 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
185a0 49 4f 4e 53 2c 20 65 72 72 2c 20 73 74 72 65 72  IONS, err, strer
185b0 72 6f 72 28 65 72 72 29 29 3b 0a 20 20 20 20 20  ror(err));.     
185c0 20 7d 0a 23 20 20 65 6e 64 69 66 0a 20 20 20 20   }.#  endif.    
185d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54  }else{.      OST
185e0 52 41 43 45 33 28 22 47 45 54 4c 4f 43 4b 50 41  RACE3("GETLOCKPA
185f0 54 48 20 20 6d 6b 64 69 72 20 25 73 20 70 69 64  TH  mkdir %s pid
18600 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67  =%d\n", lPath, g
18610 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 7d 0a  etpid());.    }.
18620 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a      .  }.# else.
18630 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
18640 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20  lPath, "/tmp/", 
18650 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66  maxLen);.# endif
18660 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c  .#endif..  if( l
18670 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27  Path[len-1]!='/'
18680 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74   ){.    len = st
18690 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22  rlcat(lPath, "/"
186a0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20  , maxLen);.  }. 
186b0 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d   .  /* transform
186c0 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20   the db path to 
186d0 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e  a unique cache n
186e0 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d  ame */.  dbLen =
186f0 20 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b   strlen(dbPath);
18700 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
18710 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
18720 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  )<maxLen; i++){.
18730 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
18740 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
18750 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
18760 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
18770 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
18780 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
18790 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
187a0 61 78 4c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  axLen);.  return
187b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
187c0 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
187d0 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
187e0 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
187f0 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
18800 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
18810 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
18820 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
18830 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
18840 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
18850 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
18860 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
18870 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
18880 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
18890 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
188a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
188b0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
188c0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
188d0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
188e0 74 20 74 61 6b 65 6e 20 3d 20 30 3b 0a 20 20 69  t taken = 0;.  i
188f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18900 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  K;..  if( pFile-
18910 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
18920 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
18930 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18940 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
18950 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
18960 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
18970 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
18980 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
18990 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
189a0 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
189b0 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
189c0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
189d0 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
189e0 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
189f0 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
18a00 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
18a10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18a20 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
18a30 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
18a40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
18a50 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
18a60 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
18a70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
18a80 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
18a90 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
18aa0 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
18ab0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
18ac0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
18ad0 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
18ae0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
18af0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
18b00 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
18b10 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
18b20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
18b30 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
18b40 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
18b50 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
18b60 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
18b70 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
18b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20  .}../*.** Takes 
18b90 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65  an already fille
18ba0 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61  d in unix file a
18bb0 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20  nd alters it so 
18bc0 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  all file locking
18bd0 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72   .** will be per
18be0 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f  formed on the lo
18bf0 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  cal proxy lock f
18c00 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ile.  The follow
18c10 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72  ing fields.** ar
18c20 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74  e preserved in t
18c30 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
18c40 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  xt so that they 
18c50 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
18c60 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78  and .** the unix
18c70 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65   structure prope
18c80 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61  rly cleaned up a
18c90 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a  t close time:.**
18ca0 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65    ->lockingConte
18cb0 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64  xt.**  ->pMethod
18cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18cd0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
18ce0 46 6f 72 4c 6f 63 6b 50 72 6f 78 79 28 75 6e 69  ForLockProxy(uni
18cf0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
18d00 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
18d10 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
18d20 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
18d30 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58   char dbPath[MAX
18d40 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
18d50 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b   *lockPath=NULL;
18d60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18d70 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
18d80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
18d90 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
18da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
18db0 53 59 3b 0a 20 20 7d 0a 20 20 67 65 74 44 62 50  SY;.  }.  getDbP
18dc0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
18dd0 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
18de0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
18df0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
18e00 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
18e10 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
18e20 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
18e30 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
18e40 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
18e50 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
18e60 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E4("TRANSPROXY  
18e70 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
18e80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
18e90 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
18ea0 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
18eb0 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
18ec0 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d  id());..  pCtx =
18ed0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
18ee0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
18ef0 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
18f00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18f10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
18f20 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30    memset(pCtx, 0
18f30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29  , sizeof(*pCtx))
18f40 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 43 6f 6e  ;..  rc = getCon
18f50 63 68 50 61 74 68 46 72 6f 6d 44 42 50 61 74 68  chPathFromDBPath
18f60 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  (dbPath, &pCtx->
18f70 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
18f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18fa0 63 72 65 61 74 65 50 72 6f 78 79 55 6e 69 78 46  createProxyUnixF
18fb0 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ile(pCtx->conchF
18fc0 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  ilePath, &pCtx->
18fd0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 7d 20  conchFile);.  } 
18fe0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
18ff0 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74  TE_OK && lockPat
19000 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  h ){.    pCtx->l
19010 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
19020 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
19030 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d  , lockPath);.  }
19040 0a 0a 65 6e 64 5f 74 72 61 6e 73 66 6f 72 6d 5f  ..end_transform_
19050 66 69 6c 65 3a 0a 20 20 69 66 28 20 72 63 3d 3d  file:.  if( rc==
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69   /* all memory i
19080 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f  s allocated, pro
19090 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20  xys are created 
190a0 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20  and assigned, . 
190b0 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65     ** switch the
190c0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
190d0 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
190e0 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f  n return..    */
190f0 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74  .    pCtx->dbPat
19100 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
19110 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a  Dup(0, dbPath);.
19120 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63      pCtx->oldLoc
19130 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46  kingContext = pF
19140 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
19150 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
19160 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
19170 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d   pCtx;.    pCtx-
19180 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46  >pOldMethod = pF
19190 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20  ile->pMethod;.  
191a0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
191b0 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f   = &proxyIoMetho
191c0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
191d0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
191e0 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 72  File ){ .      r
191f0 63 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  c = pCtx->conchF
19200 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
19210 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
19220 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68  le *)pCtx->conch
19230 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
19240 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
19260 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
19270 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
19280 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
19290 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
192a0 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ); .    sqlite3_
192b0 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a  free(pCtx);.  }.
192c0 20 20 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e    OSTRACE3("TRAN
192d0 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22  SPROXY  %d %s\n"
192e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
192f0 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
19300 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
19310 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
19320 75 72 6e 20 72 63 3b 0a 7d 20 0a 0a 73 74 61 74  urn rc;.} ..stat
19330 69 63 20 69 6e 74 20 63 72 65 61 74 65 50 72 6f  ic int createPro
19340 78 79 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73 74  xyUnixFile(const
19350 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e 69   char *path, uni
19360 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29 20  xFile **ppFile) 
19370 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
19380 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  t dirfd = -1;.  
19390 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
193a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
193b0 45 5f 4f 4b 3b 0a 0a 20 20 66 64 20 3d 20 6f 70  E_OK;..  fd = op
193c0 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 57 52 20  en(path, O_RDWR 
193d0 7c 20 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54  | O_CREAT, SQLIT
193e0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
193f0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
19400 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
19410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
19420 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 0a 20 20  TOPEN;.  }.  .  
19430 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
19440 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
19450 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  c(sizeof(unixFil
19460 65 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e));.  if( pNew=
19470 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
19480 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19490 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65      goto end_cre
194a0 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20  ate_proxy;.  }. 
194b0 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
194c0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
194d0 29 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ));.  .  rc = fi
194e0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 4e 55 4c  llInUnixFile(NUL
194f0 4c 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73  L, fd, dirfd, (s
19500 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
19510 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a  w, path, 0, 0);.
19520 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19530 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
19540 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
19550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19560 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
19570 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f  proxy:    .  clo
19580 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  se(fd); /* silen
19590 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65  tly leak fd if e
195a0 72 72 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65  rror, we're alre
195b0 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
195c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
195d0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
195e0 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
195f0 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
19600 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  N__) && SQLITE_E
19610 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
19620 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
19630 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73   proxy locking s
19640 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tyle is intended
19650 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46   for use with AF
19660 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  P filesystems..*
19670 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20  * And since AFP 
19680 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
19690 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65  d on MacOSX, the
196a0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
196b0 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69  s also.** restri
196c0 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a  cted to MacOSX..
196d0 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ** .**.*********
196e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
196f0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
19700 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19720 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19770 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
19780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
197d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
197e0 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
197f0 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
19800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19810 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
19820 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
19830 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
19840 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
19850 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
19860 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
19870 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
19880 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
19890 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
198a0 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
198b0 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
198c0 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
198d0 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
198e0 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
198f0 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
19900 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
19910 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
19920 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
19930 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
19940 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
19950 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
19960 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
19970 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
19980 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19990 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
199a0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
199b0 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
199c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
199d0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
199e0 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
199f0 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
19a00 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
19a10 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
19a20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
19a30 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
19a40 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
19a50 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
19a60 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
19a70 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
19a80 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
19a90 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
19aa0 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
19ab0 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
19ac0 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
19ad0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
19ae0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
19af0 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
19b00 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
19b10 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  681..**.** To av
19b20 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
19b30 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
19b40 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68  a failed read th
19b50 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
19b60 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
19b70 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
19b80 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
19b90 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
19ba0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
19bb0 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
19bc0 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
19bd0 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
19be0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20  64 newOffset;.  
19bf0 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
19c00 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19c10 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  AD).  got = prea
19c20 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19c30 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53  nt, offset);.  S
19c40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19c50 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
19c60 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19c70 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
19c80 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
19c90 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19ca0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
19cb0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
19cc0 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
19cd0 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
19ce0 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
19cf0 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ET);.  SimulateI
19d00 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19d10 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  t-- );.  if( new
19d20 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
19d30 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
19d40 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
19d50 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19d60 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
19d70 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
19d80 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
19d90 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
19da0 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
19db0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
19dc0 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64    }.  got = read
19dd0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19de0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
19df0 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
19e00 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
19e10 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19e20 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19e30 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52   }.  OSTRACE5("R
19e40 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
19e50 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
19e60 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
19e70 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
19e80 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
19e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
19ea0 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
19eb0 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
19ec0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19ed0 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
19ee0 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
19ef0 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
19f00 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
19f10 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
19f20 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19f30 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
19f40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19f50 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
19f60 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
19f70 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
19f80 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  t.){.  int got;.
19f90 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
19fa0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
19fb0 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ead((unixFile*)i
19fc0 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  d, offset, pBuf,
19fd0 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74   amt);.  if( got
19fe0 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  ==amt ){.    ret
19ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a000 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30   }else if( got<0
1a010 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45   ){.    /* lastE
1a020 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
1a030 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72  AndRead */.    r
1a040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a050 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
1a060 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1a070 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1a080 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
1a090 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1a0a0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
1a0b0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
1a0c0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
1a0d0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
1a0e0 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
1a0f0 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
1a100 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
1a110 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1a120 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
1a130 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
1a140 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
1a150 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
1a160 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
1a170 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
1a180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1a190 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1a1a0 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
1a1b0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
1a1c0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
1a1d0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
1a1e0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
1a1f0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1a200 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1a210 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1a220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a230 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
1a240 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
1a250 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
1a260 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
1a270 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
1a280 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20  64 newOffset;.  
1a290 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
1a2a0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1a2b0 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69  AD).  got = pwri
1a2c0 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
1a2d0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65  cnt, offset);.#e
1a2e0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1a2f0 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d  PREAD64).  got =
1a300 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c   pwrite64(id->h,
1a310 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1a320 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77  et);.#else.  new
1a330 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
1a340 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
1a350 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e  EK_SET);.  if( n
1a360 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
1a370 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   ){.    if( newO
1a380 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
1a390 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1a3a0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1a3b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c  = errno;.    }el
1a3c0 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  se{.      ((unix
1a3d0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1a3e0 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20  rrno = 0;....   
1a3f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31   }.    return -1
1a400 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72  ;.  }.  got = wr
1a410 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
1a420 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
1a430 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
1a440 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
1a450 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1a460 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1a470 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1a480 35 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  5("WRITE   %-3d 
1a490 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1a4a0 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
1a4b0 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
1a4c0 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  PSED);.  return 
1a4d0 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
1a4e0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
1a4f0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
1a500 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
1a510 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1a520 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
1a530 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
1a540 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
1a550 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
1a560 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
1a570 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
1a580 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
1a590 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
1a5a0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
1a5b0 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  ){.  int wrote =
1a5c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1a5d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a5e0 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  t>0 );.  while( 
1a5f0 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
1a600 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
1a610 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66  unixFile*)id, of
1a620 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1a630 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
1a640 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
1a650 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
1a660 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
1a670 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
1a680 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
1a690 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
1a6a0 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
1a6b0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1a6c0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
1a6d0 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28   amt=1 ));.  if(
1a6e0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
1a6f0 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20  ( wrote<0 ){.   
1a700 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1a710 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1a720 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1a730 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a740 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1a750 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
1a760 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1a770 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
1a780 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1a790 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1a7a0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1a7b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1a7c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a7d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1a7e0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1a7f0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
1a800 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
1a810 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
1a820 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
1a830 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
1a840 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
1a850 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1a860 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1a870 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1a880 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1a890 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1a8a0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1a8b0 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
1a8c0 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
1a8d0 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
1a8e0 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
1a8f0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
1a900 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
1a910 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
1a920 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
1a930 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
1a940 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1a950 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1a960 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1a970 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1a980 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1a990 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1a9a0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1a9b0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1a9c0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1a9d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1a9e0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1a9f0 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1aa00 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1aa10 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1aa20 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1aa30 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1aa40 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1aa50 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1aa60 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1aa70 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1aa80 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1aa90 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1aaa0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1aab0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1aac0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1aad0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1aae0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1aaf0 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1ab00 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1ab10 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1ab20 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1ab30 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1ab40 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1ab50 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1ab60 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1ab70 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1ab80 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1ab90 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1aba0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1abb0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1abc0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1abd0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1abe0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1abf0 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1ac00 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1ac10 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1ac20 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1ac30 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1ac40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1ac50 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
1ac60 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
1ac70 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
1ac80 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
1ac90 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
1aca0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
1acb0 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
1acc0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
1acd0 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
1ace0 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
1acf0 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
1ad00 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
1ad10 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
1ad20 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
1ad30 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
1ad40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ad50 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
1ad60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1ad70 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1ad80 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
1ad90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ada0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1adb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1adc0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
1add0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1ade0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1adf0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
1ae00 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
1ae10 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1ae20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1ae30 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1ae40 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1ae50 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1ae60 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1ae70 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1ae80 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1ae90 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1aea0 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1aeb0 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1aec0 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1aed0 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1aee0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1aef0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1af00 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1af10 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1af20 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1af30 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1af40 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1af50 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1af60 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1af70 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1af80 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1af90 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
1afa0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
1afb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
1afc0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1afd0 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1afe0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  nc ){.    rc = f
1aff0 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1b000 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1b010 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1b020 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1b030 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1b040 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1b050 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1b060 63 28 29 2e 0a 20 20 20 2a 20 49 74 20 73 68 6f  c()..   * It sho
1b070 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1b080 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1b090 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1b0a0 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c 65  local .   * file
1b0b0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1b0c0 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1b0d0 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1b0e0 46 53 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27 74  FSYNC.   * isn't
1b0f0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1b100 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1b110 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1b120 66 73 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64 20  fsync .   * and 
1b130 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1b140 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1b150 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1b160 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 20  cntl call.  .   
1b170 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1b180 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1b190 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1b1a0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 20  e and avoid .   
1b1b0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1b1c0 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1b1d0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 2a   is called..   *
1b1e0 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1b1f0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1b200 6c 73 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f  lse .  if( dataO
1b210 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
1b220 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20  fdatasync(fd);. 
1b230 20 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b     if( OS_VXWORK
1b240 53 20 26 26 20 72 63 3d 3d 2d 31 20 26 26 20 65  S && rc==-1 && e
1b250 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1b260 0a 20 20 20 20 20 20 72 63 20 3d 20 66 73 79 6e  .      rc = fsyn
1b270 63 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  c(fd);.    }.  }
1b280 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66  else{.    rc = f
1b290 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
1b2a0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1b2b0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1b2c0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1b2d0 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1b2e0 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1b2f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1b300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b320 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
1b330 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
1b340 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
1b350 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1b360 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20   If dataOnly==0 
1b370 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69  then both the fi
1b380 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74  le itself and it
1b390 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65  s metadata (file
1b3a0 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73  .** size, access
1b3b0 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20   time, etc) are 
1b3c0 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61  synced.  If data
1b3d0 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c  Only!=0 then onl
1b3e0 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61  y the.** file da
1b3f0 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  ta is synced..**
1b400 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20  .** Under Unix, 
1b410 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  also make sure t
1b420 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  hat the director
1b430 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1b440 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
1b450 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e   created by fsyn
1b460 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  c-ing the direct
1b470 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
1b480 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  s the file..** I
1b490 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74  f we do not do t
1b4a0 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75  his and we encou
1b4b0 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  nter a power fai
1b4c0 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74  lure, the direct
1b4d0 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  ory.** entry for
1b4e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1b4f0 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74  ht not exist aft
1b500 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54  er we reboot.  T
1b510 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74  he next.** SQLit
1b520 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
1b530 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  file will not kn
1b540 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ow that the jour
1b550 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61  nal exists (beca
1b560 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  use.** the direc
1b570 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
1b580 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e  he journal was n
1b590 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e  ever created) an
1b5a0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
1b5b0 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f  n.** will not ro
1b5c0 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62  ll back - possib
1b5d0 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61  ly leading to da
1b5e0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1b5f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1b600 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65   unixSync(sqlite
1b610 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1b620 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
1b630 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
1b640 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1b650 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61  )id;..  int isDa
1b660 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26  taOnly = (flags&
1b670 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
1b680 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46  ONLY);.  int isF
1b690 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73  ullsync = (flags
1b6a0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1b6b0 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  YNC_FULL;..  /* 
1b6c0 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
1b6d0 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
1b6e0 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
1b6f0 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
1b700 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
1b710 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
1b720 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
1b730 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1b740 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
1b750 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
1b760 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
1b770 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
1b780 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
1b790 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
1b7a0 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
1b7b0 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
1b7c0 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
1b7d0 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
1b7e0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
1b7f0 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
1b800 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
1b810 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
1b820 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  e );.  OSTRACE2(
1b830 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
1b840 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72  , pFile->h);.  r
1b850 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1b860 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1b870 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1b880 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b890 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1b8a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1b8b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b8c0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1b8d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1b8e0 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SYNC;.  }.  if( 
1b8f0 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
1b900 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  ){.    int err;.
1b910 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49      OSTRACE4("DI
1b920 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65  RSYNC %-3d (have
1b930 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1b940 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1b950 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20  File->dirfd,.   
1b960 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1b970 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1b980 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ync);.#ifndef SQ
1b990 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
1b9a0 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20  SYNC.    /* The 
1b9b0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1b9c0 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
1b9d0 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69   if full_fsync i
1b9e0 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20  s.    ** turned 
1b9f0 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62  off or unavailab
1ba00 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66  le.  If a full_f
1ba10 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62  sync occurred ab
1ba20 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ove,.    ** then
1ba30 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
1ba40 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f  ync is superfluo
1ba50 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  us..    */.    i
1ba60 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53  f( (!HAVE_FULLFS
1ba70 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79  YNC || !isFullsy
1ba80 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e  nc) && full_fsyn
1ba90 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30  c(pFile->dirfd,0
1baa0 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a  ,0) ){.       /*
1bab0 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61  .       ** We ha
1bac0 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  ve received mult
1bad0 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20  iple reports of 
1bae0 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e  fsync() returnin
1baf0 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  g.       ** erro
1bb00 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20  rs when applied 
1bb10 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f  to directories o
1bb20 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73  n certain file s
1bb30 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a  ystems..       *
1bb40 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63  * A failed direc
1bb50 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74  tory sync is not
1bb60 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f   a big deal.  So
1bb70 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20   it seems.      
1bb80 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67   ** better to ig
1bb90 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20  nore the error. 
1bba0 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20   Ticket #1657.  
1bbb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f       */.       /
1bbc0 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  * pFile->lastErr
1bbd0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20  no = errno; */. 
1bbe0 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1bbf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f  SQLITE_IOERR; */
1bc00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1bc10 20 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46    err = close(pF
1bc20 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20  ile->dirfd); /* 
1bc30 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e  Only need to syn
1bc40 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65  c once, so close
1bc50 20 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20   the */.    if( 
1bc60 65 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  err==0 ){       
1bc70 20 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74         /* direct
1bc80 6f 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20  ory when we are 
1bc90 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46  done */.      pF
1bca0 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
1bcb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bcc0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1bcd0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1bce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1bcf0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
1bd00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bd10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1bd20 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1bd30 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1bd40 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1bd50 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1bd60 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1bd70 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1bd80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
1bd90 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69  sert( id );.  Si
1bda0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1bdb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1bdc0 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20  RR_TRUNCATE );. 
1bdd0 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
1bde0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1bdf0 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
1be00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1be10 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1be20 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1be30 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1be40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1be50 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65  RUNCATE;.  }else
1be60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1be70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1be80 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1be90 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1bea0 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1beb0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1bec0 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1bed0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1bee0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1bef0 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1bf00 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1bf10 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1bf20 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c   fstat(((unixFil
1bf30 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1bf40 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1bf50 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1bf60 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1bf70 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1bf80 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1bf90 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1bfa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1bfb0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1bfc0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1bfd0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1bfe0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1bff0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1c000 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65  LockInfo() proce
1c010 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1c020 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1c030 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1c040 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1c050 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1c060 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1c070 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1c080 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1c090 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1c0a0 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1c0b0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1c0c0 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1c0d0 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1c0e0 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1c0f0 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1c100 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1c110 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1c120 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1c130 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1c140 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1c150 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1c160 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1c170 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1c180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1c190 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1c1a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c1b0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1c1c0 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
1c1d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1c1e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1c1f0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1c200 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1c210 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
1c220 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
1c230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c240 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1c250 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1c260 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1c270 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1c280 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1c290 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1c2a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c2b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1c2c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c2d0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41   && defined(__DA
1c2e0 52 57 49 4e 5f 5f 29 0a 20 20 20 20 63 61 73 65  RWIN__).    case
1c2f0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
1c300 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1c310 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
1c320 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1c330 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
1c340 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
1c350 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
1c360 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
1c370 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
1c380 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
1c390 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
1c3a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
1c3b0 78 74 3b 0a 20 20 20 20 20 20 20 20 74 61 6b 65  xt;.        take
1c3c0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
1c3d0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
1c3e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
1c400 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
1c410 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
1c420 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
1c430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c440 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
1c450 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
1c460 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
1c470 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
1c480 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
1c490 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
1c4a0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
1c4b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1c4c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c4d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c4e0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1c4f0 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
1c500 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c510 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
1c520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c530 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
1c540 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
1c550 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
1c560 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
1c570 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
1c580 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
1c590 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
1c5a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c5b0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
1c5c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
1c5d0 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
1c5e0 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
1c5f0 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
1c600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1c610 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
1c620 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
1c630 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
1c640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c650 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
1c660 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
1c670 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
1c680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1c6b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
1c6c0 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
1c6d0 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
1c6e0 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
1c6f0 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
1c700 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
1c710 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
1c720 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
1c730 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
1c740 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
1c750 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1c760 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
1c770 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
1c780 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
1c790 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
1c7a0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
1c7b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1c7c0 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
1c7d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
1c7e0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
1c7f0 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
1c800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c820 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1c830 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1c840 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
1c850 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
1c860 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
1c870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1c880 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1c890 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
1c8a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
1c8b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72           rc = tr
1c8c0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 46  ansformUnixFileF
1c8d0 6f 72 4c 6f 63 6b 50 72 6f 78 79 28 70 46 69 6c  orLockProxy(pFil
1c8e0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
1c8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c910 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c920 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1c930 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
1c940 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1c950 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1c960 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1c970 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1c980 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1c990 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1c9a0 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1c9b0 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1c9c0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1c9d0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1c9e0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1c9f0 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1ca00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1ca10 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1ca20 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1ca30 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1ca40 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1ca50 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1ca60 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1ca70 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1ca80 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1ca90 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1caa0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1cab0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1cac0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
1cad0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1cae0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1caf0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1cb00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1cb10 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1cb20 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1cb30 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1cb40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cb50 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1cb60 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
1cb70 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
1cb80 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75  s always 0 for u
1cb90 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nix..*/.static i
1cba0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
1cbb0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
1cbc0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1cbd0 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1cbe0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1cbf0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1cc00 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
1cc10 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1cc20 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
1cc30 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
1cc40 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1cc50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
1cc60 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
1cc70 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1cc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc90 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1cca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ccb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ccc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ccd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cce0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  **/../*.** Each 
1ccf0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1cd00 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
1cd10 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
1cd20 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
1cd30 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
1cd40 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
1cd50 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
1cd60 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
1cd70 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
1cd80 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1cd90 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
1cda0 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
1cdb0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1cdc0 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
1cdd0 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
1cde0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
1cdf0 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
1ce00 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
1ce10 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
1ce20 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
1ce30 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f  DS(FINDER, METHO
1ce40 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  D, CLOSE, LOCK, 
1ce50 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ce70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1ce80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1ce90 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1cec0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cee0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1cf10 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf30 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1cf60 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1cf80 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1cfb0 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
1cfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1cfd0 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1d000 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
1d010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1d020 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1d050 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
1d060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1d070 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1d0a0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1d0b0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1d0c0 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1d110 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
1d140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d150 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1d160 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1d1b0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1d1e0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1d1f0 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1d200 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
1d230 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1d240 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1d250 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
1d280 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1d290 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
1d2a0 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1d310 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1d320 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1d330 20 2a 46 49 4e 44 45 52 28 63 6f 6e 73 74 20 63   *FINDER(const c
1d340 68 61 72 20 2a 7a 2c 20 69 6e 74 20 68 29 7b 20  har *z, int h){ 
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1d360 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d370 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
1d380 52 41 4d 45 54 45 52 28 68 29 3b 20 20 20 20 20  RAMETER(h);     
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1d3b0 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
1d400 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
1d410 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
1d420 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1d430 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
1d440 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
1d450 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
1d460 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
1d470 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
1d480 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
1d490 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
1d4a0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
1d4b0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
1d4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1d4d0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1d4e0 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
1d4f0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1d500 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1d510 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1d520 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43   name */.  unixC
1d530 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1d540 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1d550 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
1d560 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1d570 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1d580 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
1d590 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1d5a0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1d5b0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
1d5c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1d5d0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1d5e0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1d5f0 64 20 2a 2f 0a 29 3b 0a 49 4f 4d 45 54 48 4f 44  d */.);.IOMETHOD
1d600 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
1d610 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
1d620 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1d630 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
1d640 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
1d650 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1d660 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1d670 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  ct name */.  nol
1d680 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
1d690 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1d6a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
1d6b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
1d6c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1d6d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1d6e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
1d6f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1d700 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
1d710 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1d720 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
1d730 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1d740 68 6f 64 20 2a 2f 0a 29 3b 0a 49 4f 4d 45 54 48  hod */.);.IOMETH
1d750 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
1d760 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1d770 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1d780 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
1d790 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
1d7a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1d7b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1d7c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ject name */.  d
1d7d0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
1d7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1d7f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
1d800 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
1d810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1d820 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
1d830 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
1d840 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1d850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
1d860 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
1d870 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
1d880 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1d890 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a 0a 23 69 66  ethod */.);..#if
1d8a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d8b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
1d8c0 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
1d8d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1d8e0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1d8f0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1d900 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
1d910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1d920 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1d930 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1d940 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
1d950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d960 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1d970 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
1d980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d990 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1d9a0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1d9c0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1d9d0 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
1d9e0 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
1d9f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1da00 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 3b 0a 23  k method */.);.#
1da10 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
1da20 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
1da30 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da50 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1da60 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
1da70 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1da80 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1da90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1daa0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 43 6c   name */.  semCl
1dab0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1dac0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1dad0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
1dae0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1daf0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1db00 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
1db10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1db20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1db30 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
1db40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1db50 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1db60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1db70 64 20 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 0a 0a  d */.);.#endif..
1db80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41  #if defined(__DA
1db90 52 57 49 4e 5f 5f 29 20 26 26 20 53 51 4c 49 54  RWIN__) && SQLIT
1dba0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1dbb0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
1dbc0 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c  (.  afpIoFinder,
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dbe0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1dbf0 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f   name */.  afpIo
1dc00 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1dc10 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1dc20 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1dc30 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 43  t name */.  afpC
1dc40 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1dc50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1dc60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
1dc70 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1dc80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1dc90 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
1dca0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1dcb0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1dcc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
1dcd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1dce0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1dcf0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1dd00 6f 64 20 2a 2f 0a 29 3b 0a 49 4f 4d 45 54 48 4f  od */.);.IOMETHO
1dd10 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
1dd20 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1dd30 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1dd40 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
1dd50 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
1dd60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1dd70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1dd80 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ect name */.  pr
1dd90 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
1dda0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1ddb0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
1ddc0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
1ddd0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1dde0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
1ddf0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
1de00 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1de10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
1de20 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
1de30 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
1de40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
1de50 74 68 6f 64 20 2a 2f 0a 29 3b 0a 23 65 6e 64 69  thod */.);.#endi
1de60 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f...#if defined(
1de70 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20 53  __DARWIN__) && S
1de80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1de90 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
1dea0 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
1deb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
1dec0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
1ded0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
1dee0 20 66 6f 72 0a 2a 2a 20 74 68 65 20 67 69 76 65   for.** the give
1def0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1df00 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
1df10 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
1df20 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
1df30 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
1df40 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
1df50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1df60 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
1df70 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1df80 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1df90 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1dfa0 69 6e 64 65 72 28 0a 20 20 63 6f 6e 73 74 20 63  inder(.  const c
1dfb0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
1dfc0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
1dfd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1dfe0 2f 0a 20 20 69 6e 74 20 66 64 20 20 20 20 20 20  /.  int fd      
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1e010 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1e020 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
1e030 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1e040 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
1e050 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e060 7a 46 69 6c 65 73 79 73 74 65 6d 3b 0a 20 20 20  zFilesystem;.   
1e070 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1e080 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
1e090 6f 64 73 3b 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  ods;.  } aMap[] 
1e0a0 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
1e0b0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
1e0c0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
1e0d0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
1e0e0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1e0f0 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
1e100 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 69 66 64 65  Methods },.#ifde
1e110 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e120 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a  AFP_LOCKING_SMB.
1e130 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
1e140 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
1e150 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d  .#else.    { "sm
1e160 62 66 73 22 2c 20 20 26 66 6c 6f 63 6b 49 6f 4d  bfs",  &flockIoM
1e170 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6e 64 69 66  ethods },.#endif
1e180 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
1e190 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1e1a0 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
1e1b0 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
1e1c0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
1e1d0 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
1e1e0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
1e1f0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
1e200 68 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  h ){.    return 
1e210 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
1e220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
1e230 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
1e240 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
1e250 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
1e260 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
1e270 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
1e280 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
1e290 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
1e2a0 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
1e2b0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
1e2c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
1e2d0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
1e2e0 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
1e2f0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
1e300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e310 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
1e320 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
1e330 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
1e340 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
1e350 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
1e360 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
1e370 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
1e380 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
1e390 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
1e3a0 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
1e3b0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
1e3c0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
1e3d0 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
1e3e0 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
1e3f0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
1e400 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
1e410 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
1e420 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
1e430 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
1e440 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
1e450 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
1e460 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
1e470 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
1e480 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
1e490 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
1e4a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1e4b0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
1e4c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 23 65  ethods;.  }.}.#e
1e4d0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1e4e0 5f 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20 53  __DARWIN__) && S
1e4f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e500 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
1e510 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
1e520 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
1e530 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68  ter to a IO meth
1e540 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
1e550 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
1e560 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1e570 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
1e580 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
1e590 61 72 2a 2c 69 6e 74 29 3b 0a 0a 0a 2f 2a 2a 2a  ar*,int);.../***
1e5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e600 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1e610 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e630 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1e640 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1e650 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1e660 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1e670 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1e680 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1e690 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
1e6a0 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
1e6b0 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
1e6c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
1e6d0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
1e6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1e6f0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
1e700 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e710 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
1e720 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
1e730 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e750 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
1e760 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
1e770 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
1e780 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20  int dirfd,      
1e790 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
1e7a0 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1e7b0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
1e7c0 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
1e7d0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
1e7e0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1e7f0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1e800 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e810 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
1e820 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
1e830 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
1e840 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20   noLock,        
1e850 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63       /* Omit loc
1e860 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  king if true */.
1e870 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1e890 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20  ete on close if 
1e8a0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  true */.){.  con
1e8b0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1e8c0 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
1e8d0 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
1e8e0 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
1e8f0 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
1e900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e910 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1e920 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a  >pLock==NULL );.
1e930 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1e940 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  pOpen==NULL );..
1e950 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
1e960 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
1e970 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
1e980 20 50 61 72 61 6d 65 74 65 72 20 70 56 66 73 20   Parameter pVfs 
1e990 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65  is only.  ** use
1e9a0 64 20 69 66 20 45 4e 41 42 4c 45 5f 4c 4f 43 4b  d if ENABLE_LOCK
1e9b0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 64 65 66  ING_STYLE is def
1e9c0 69 6e 65 64 2e 20 45 78 70 72 65 73 73 20 74 68  ined. Express th
1e9d0 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20  is explicitly . 
1e9e0 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76   ** here to prev
1e9f0 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
1ea00 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
1ea10 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
1ea20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
1ea30 52 4b 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  RKS.  UNUSED_PAR
1ea40 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
1ea50 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  ;.#endif.#if !SQ
1ea60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1ea70 49 4e 47 5f 53 54 59 4c 45 0a 20 20 55 4e 55 53  ING_STYLE.  UNUS
1ea80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1ea90 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  s);.#endif.#if !
1eaa0 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 21 53  OS_VXWORKS && !S
1eab0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1eac0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 55 4e 55  KING_STYLE.  UNU
1ead0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 46  SED_PARAMETER(zF
1eae0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
1eaf0 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50  ..  OSTRACE3("OP
1eb00 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
1eb10 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  , h, zFilename);
1eb20 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d      .  pNew->h =
1eb30 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
1eb40 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54  d = dirfd;.  SET
1eb50 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b  _THREADID(pNew);
1eb60 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1eb70 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
1eb80 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
1eb90 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
1eba0 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
1ebb0 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20  ){.    noLock = 
1ebc0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
1ebd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
1ebe0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f  ndif..  if( noLo
1ebf0 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  ck ){.    pLocki
1ec00 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
1ec10 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
1ec20 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
1ec30 67 53 74 79 6c 65 20 3d 20 28 2a 28 66 69 6e 64  gStyle = (*(find
1ec40 65 72 5f 74 79 70 65 29 70 56 66 73 2d 3e 70 41  er_type)pVfs->pA
1ec50 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
1ec60 65 2c 20 68 29 3b 0a 23 69 66 20 53 51 4c 49 54  e, h);.#if SQLIT
1ec70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ec80 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
1ec90 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
1eca0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
1ecb0 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
1ecc0 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
1ecd0 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
1ece0 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
1ecf0 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
1ed00 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
1ed10 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
1ed20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
1ed30 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
1ed40 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
1ed50 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
1ed60 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
1ed70 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
1ed80 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
1ed90 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
1eda0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1edb0 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
1edc0 73 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74  s ){.    unixEnt
1edd0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
1ede0 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
1edf0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c  (pNew, &pNew->pL
1ee00 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
1ee10 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  n);.    unixLeav
1ee20 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
1ee30 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1ee40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1ee50 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  & defined(__DARW
1ee60 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  IN__).  else if(
1ee70 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1ee80 3d 20 26 61 70 66 49 6f 4d 65 74 68 6f 64 73 20  = &apfIoMethods 
1ee90 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
1eea0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1eeb0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1eec0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
1eed0 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
1eee0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
1eef0 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
1ef00 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1ef10 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
1ef20 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
1ef30 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
1ef40 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1ef50 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
1ef60 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
1ef70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ef80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1ef90 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
1efa0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
1efb0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
1efc0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
1efd0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
1efe0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
1eff0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
1f000 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
1f010 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
1f020 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
1f030 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
1f040 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
1f050 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
1f060 61 6d 65 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  ame;.      srand
1f070 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
1f080 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1f090 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
1f0a0 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 4e  LockInfo(pNew, N
1f0b0 55 4c 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ULL, &pNew->pOpe
1f0c0 6e 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c 65  n);.      unixLe
1f0d0 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
1f0e0 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
1f0f0 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1f100 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1f110 53 54 59 4c 45 0a 20 20 65 6c 73 65 20 69 66 28  STYLE.  else if(
1f120 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1f130 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
1f140 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
1f150 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
1f160 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
1f170 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
1f180 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
1f190 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
1f1a0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
1f1b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
1f1c0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
1f1d0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
1f1e0 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
1f1f0 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
1f200 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
1f210 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
1f220 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46  qlite3_malloc(nF
1f230 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
1f240 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29  ( zLockFile==0 )
1f250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f260 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1f270 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1f280 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
1f290 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
1f2a0 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f  e, "%s" DOTLOCK_
1f2b0 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d  SUFFIX, zFilenam
1f2c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  e);.    }.    pN
1f2d0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1f2e0 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  xt = zLockFile;.
1f2f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
1f300 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
1f310 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
1f320 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
1f330 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
1f340 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
1f350 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1f360 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1f370 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1f380 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
1f390 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
1f3a0 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
1f3b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1f3c0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
1f3d0 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  ockInfo(pNew, &p
1f3e0 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
1f3f0 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  w->pOpen);.    i
1f400 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
1f410 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70  K) && (pNew->pOp
1f420 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  en->pSem==NULL) 
1f430 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1f440 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
1f450 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b  pOpen->aSemName;
1f460 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1f470 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1f480 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1f490 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 25 73  E, zSemName, "%s
1f4a0 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1f4c0 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
1f4d0 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
1f4e0 66 6f 72 28 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61  for( n=0; zSemNa
1f4f0 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
1f500 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
1f510 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
1f520 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
1f530 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e       pNew->pOpen
1f540 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
1f550 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
1f560 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
1f570 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
1f580 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  Open->pSem == SE
1f590 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
1f5a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f5b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
1f5c0 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d  New->pOpen->aSem
1f5d0 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
1f5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f5f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1f600 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
1f610 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72   .  pNew->lastEr
1f620 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  rno = 0;.#if OS_
1f630 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1f640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f650 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
1f660 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
1f670 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
1f680 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
1f690 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
1f6a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f6b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
1f6c0 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
1f6d0 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
1f6e0 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  t leak if fail, 
1f6f0 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
1f700 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 68 29   */.    close(h)
1f710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f720 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
1f730 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
1f740 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
1f750 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f760 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
1f770 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f780 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
1f790 74 20 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e  t getDbPathForUn
1f7a0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
1f7b0 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
1f7c0 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e  Path){.#if defin
1f7d0 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20  ed(__DARWIN__). 
1f7e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
1f7f0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
1f800 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61  hods ){.    /* a
1f810 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61  fp style keeps a
1f820 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1f830 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65  e db path in the
1f840 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20   filePath field 
1f850 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1f860 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73  truct */.    ass
1f870 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
1f880 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
1f890 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
1f8a0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
1f8b0 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66  cpy(dbPath, ((af
1f8c0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1f8d0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
1f8e0 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68  Context)->dbPath
1f8f0 29 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ).  }else.#endif
1f900 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
1f910 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63  ethod == &dotloc
1f920 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
1f930 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74    /* dot lock st
1f940 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63  yle uses the loc
1f950 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
1f960 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f  store the dot lo
1f970 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70  ck.    ** file p
1f980 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ath */.    int l
1f990 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  en = strlen((cha
1f9a0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
1f9b0 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72  ngContext) - str
1f9c0 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  len(DOTLOCK_SUFF
1f9d0 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  IX);.    memcpy(
1f9e0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
1f9f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1fa00 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b  ntext, len + 1);
1fa10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fa20 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65   all other style
1fa30 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e  s use the lockin
1fa40 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
1fa50 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70  re the db file p
1fa60 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ath */.    asser
1fa70 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  t( strlen((char*
1fa80 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
1fa90 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
1faa0 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 63 70  LEN );.    strcp
1fab0 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
1fac0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
1fad0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
1fae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1faf0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1fb00 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1fb10 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1fb20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1fb30 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1fb40 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1fb50 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1fb60 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1fb70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fb80 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1fb90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1fba0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fbb0 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1fbc0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1fbd0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1fbe0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1fbf0 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1fc00 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1fc10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1fc20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1fc30 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1fc40 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1fc50 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1fc60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fc70 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1fc80 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1fc90 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1fca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1fcb0 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1fcc0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1fcd0 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1fce0 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1fcf0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1fd00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1fd10 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1fd20 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1fd30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1fd40 69 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  ii=strlen(zDirna
1fd50 6d 65 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44  me); ii>=0 && zD
1fd60 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
1fd70 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
1fd80 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
1fd90 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
1fda0 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69     fd = open(zDi
1fdb0 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1fdc0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1fdd0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23    if( fd>=0 ){.#
1fde0 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
1fdf0 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  .      fcntl(fd,
1fe00 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
1fe10 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
1fe20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
1fe30 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1fe40 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE3("OPENDIR %-
1fe50 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1fe60 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  irname);.    }. 
1fe70 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1fe80 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f    return (fd>=0?
1fe90 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45  SQLITE_OK:SQLITE
1fea0 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f  _CANTOPEN);.}../
1feb0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
1fec0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1fed0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
1fee0 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
1fef0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
1ff00 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
1ff10 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
1ff20 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
1ff30 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
1ff40 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
1ff50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1ff60 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1ff70 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1ff80 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1ff90 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
1ffa0 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
1ffb0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
1ffc0 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
1ffd0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
1ffe0 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b  ,.     ".",.  };
1fff0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
20000 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
20010 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
20020 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
20030 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
20040 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
20050 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
20060 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
20070 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
20080 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
20090 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
200a0 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a  r *zDir = ".";..
200b0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
200c0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
200d0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
200e0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
200f0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
20100 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
20110 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
20120 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
20130 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
20140 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
20150 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
20160 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
20170 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
20180 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20  );..  azDirs[0] 
20190 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
201a0 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20 28  irectory;.  if (
201b0 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31  NULL == azDirs[1
201c0 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b  ]) {.    azDirs[
201d0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
201e0 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  DIR");.  }.  .  
201f0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
20200 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
20210 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b  (azDirs[0]); i++
20220 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72  ){.    if( azDir
20230 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
20240 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  ue;.    if( stat
20250 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66  (azDirs[i], &buf
20260 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
20270 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
20280 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
20290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
202a0 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d  access(azDirs[i]
202b0 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
202c0 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
202d0 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61  irs[i];.    brea
202e0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  k;.  }..  /* Che
202f0 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
20300 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
20310 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
20320 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
20330 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
20340 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
20350 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
20360 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
20370 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65  en(zDir) + strle
20380 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  n(SQLITE_TEMP_FI
20390 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29  LE_PREFIX) + 17)
203a0 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66   >= (size_t)nBuf
203b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
203c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
203d0 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ..  do{.    sqli
203e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
203f0 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f  f-17, zBuf, "%s/
20400 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
20410 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
20420 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
20430 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
20440 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
20450 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
20460 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
20470 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
20480 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
20490 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
204a0 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
204b0 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
204c0 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
204d0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
204e0 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
204f0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
20500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20510 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ;.}.../*.** Open
20520 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
20530 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
20540 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
20550 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
20560 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
20570 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
20580 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
20590 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
205a0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
205b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
205c0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
205d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
205e0 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
205f0 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
20600 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
20610 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
20620 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
20630 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
20640 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
20650 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
20660 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
20670 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
20680 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
20690 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
206a0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
206b0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
206c0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
206d0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
206e0 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
206f0 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
20700 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
20710 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
20720 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
20730 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
20740 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
20750 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
20760 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
20770 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
20780 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
20790 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
207a0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
207b0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
207c0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
207d0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
207e0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
207f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20800 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
20810 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
20820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
20830 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  h, .  sqlite3_fi
20840 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
20850 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
20860 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e  OutFlags.){.  in
20870 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20890 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
208a0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
208b0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
208c0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
208d0 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
208e0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
208f0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  tor */.  int ope
20900 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
20910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
20920 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
20930 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
20940 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
20950 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
20960 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
20970 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
20980 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
209a0 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
209b0 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
209c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
209d0 3b 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  ;..  int isExclu
209e0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
209f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
20a00 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
20a10 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
20a20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
20a30 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
20a40 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
20a50 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
20a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20a70 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
20a80 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
20a90 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
20aa0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
20ab0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
20ac0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20ad0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
20ae0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
20af0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
20b00 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
20b10 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
20b20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
20b30 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
20b40 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
20b50 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
20b60 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
20b70 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
20b80 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
20b90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
20ba0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
20bb0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
20bc0 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
20bd0 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
20be0 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
20bf0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
20c00 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
20c10 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
20c20 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
20c30 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
20c40 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
20c50 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
20c60 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
20c70 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
20c80 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
20c90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
20ca0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
20cb0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
20cc0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
20cd0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
20ce0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
20cf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
20d00 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
20d10 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
20d20 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
20d30 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
20d40 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
20d50 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
20d60 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
20d70 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
20d80 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
20d90 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
20da0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
20db0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
20dc0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
20dd0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
20de0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
20df0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
20e00 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
20e10 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
20e20 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
20e30 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
20e40 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
20e50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
20e60 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
20e70 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
20e80 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
20e90 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
20ea0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
20eb0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
20ec0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
20ed0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
20ee0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
20ef0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
20f00 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
20f10 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
20f20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
20f30 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  , and master jou
20f40 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61  rnal are never a
20f50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
20f60 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20  * deleted.  */. 
20f70 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
20f80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20f90 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  _DB || !isDelete
20fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
20fb0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
20fc0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
20fd0 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20   !isDelete );.  
20fe0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
20ff0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
21000 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73  R_JOURNAL || !is
21010 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
21020 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
21030 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
21040 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
21050 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
21060 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
21070 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
21080 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
21090 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
210a0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
210b0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
210c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
210d0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
210e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
210f0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
21100 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
21110 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
21120 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
21130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
21140 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
21150 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
21160 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
21170 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65  NT_DB.  );..  me
21180 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
21190 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
211a0 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  ;..  if( !zName 
211b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
211c0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
211d0 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
211e0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
211f0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
21200 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
21210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
21230 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21240 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
21250 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  e;.  }..  if( is
21260 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
21270 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
21280 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
21290 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
212a0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
212b0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
212c0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
212d0 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
212e0 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
212f0 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
21300 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
21310 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
21320 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
21330 29 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28  );..  fd = open(
21340 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
21350 2c 20 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a  , isDelete?0600:
21360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
21370 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
21380 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50  ;.  OSTRACE4("OP
21390 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
213a0 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
213b0 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
213c0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
213d0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
213e0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
213f0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
21400 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
21410 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
21420 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
21430 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
21440 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  */.    flags &= 
21450 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
21460 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
21470 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
21480 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
21490 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
214a0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f      return unixO
214b0 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c  pen(pVfs, zPath,
214c0 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70   pFile, flags, p
214d0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
214e0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
214f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21500 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69  ANTOPEN;.  }.  i
21510 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
21520 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
21530 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
21540 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e  .#else.    unlin
21550 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
21560 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
21570 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
21580 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
21590 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
215a0 6c 65 29 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  le)->openFlags =
215b0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
215c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 75  #endif.  if( pOu
215d0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
215e0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
215f0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
21600 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73  fd!=0);.  if( is
21610 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
21620 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
21630 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
21640 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
21650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21660 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
21670 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
21680 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65  ak if fail, alre
21690 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  ady in error */.
216a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
216b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
216c0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
216d0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
216e0 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  D, fcntl(fd, F_G
216f0 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
21700 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
21710 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
21720 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
21730 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49  IN_DB;..#if SQLI
21740 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
21750 4c 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50  LOCKING.  if( zP
21760 61 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f  ath!=NULL && !no
21770 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  Lock ){.    char
21780 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
21790 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
217a0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
217b0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
217c0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
217d0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
217e0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
217f0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
21800 73 20 75 73 65 20 70 72 6f 78 79 2c 20 0a 20 20  s use proxy, .  
21810 20 20 2a 2a 20 30 20 6d 65 61 6e 73 20 6e 65 76    ** 0 means nev
21820 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
21830 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
21840 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
21850 20 66 69 6c 65 73 20 6f 6e 6c 79 0a 20 20 20 20   files only.    
21860 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
21870 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
21880 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
21890 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
218a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
218b0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
218c0 73 49 6e 66 6f 3b 0a 0a 20 20 20 20 20 20 69 66  sInfo;..      if
218d0 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
218e0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
218f0 7b 0a 09 09 09 09 28 28 75 6e 69 78 46 69 6c 65  {.....((unixFile
21900 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
21910 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
21920 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
21930 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
21940 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
21950 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
21960 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
21970 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
21980 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
21990 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
219a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
219b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
219c0 45 53 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ESS;.      }.   
219d0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
219e0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
219f0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
21a00 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
21a10 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
21a20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
21a30 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
21a40 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
21a50 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
21a60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21a80 20 20 20 20 72 63 20 3d 20 74 72 61 6e 73 66 6f      rc = transfo
21a90 72 6d 55 6e 69 78 46 69 6c 65 46 6f 72 4c 6f 63  rmUnixFileForLoc
21aa0 6b 50 72 6f 78 79 28 28 75 6e 69 78 46 69 6c 65  kProxy((unixFile
21ab0 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
21ac0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
21ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21ae0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
21af0 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e  .  return fillIn
21b00 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
21b10 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
21b20 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20   zPath, noLock, 
21b30 69 73 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a 2f 2a  isDelete);.}../*
21b40 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
21b50 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
21b60 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
21b70 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
21b80 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
21b90 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
21ba0 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
21bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21bc0 6e 69 78 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nixDelete(sqlite
21bd0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
21be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
21bf0 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
21c00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21c10 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
21c20 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
21c30 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
21c40 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
21c50 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
21c60 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
21c70 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
21c80 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
21c90 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
21ca0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
21cb0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
21cc0 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
21cd0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
21ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
21cf0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
21d00 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
21d10 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
21d20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
21d30 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
21d40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
21d50 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
21d60 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
21d70 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64      if( close(fd
21d80 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20  )&&!rc ){.      
21d90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
21da0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
21db0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21dc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
21dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
21de0 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
21df0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
21e00 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
21e10 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
21e20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
21e30 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
21e40 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
21e50 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
21e60 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
21e70 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
21e80 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
21e90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
21ea0 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
21eb0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
21ec0 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
21ed0 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
21ee0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
21ef0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
21f00 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
21f10 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
21f20 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
21f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
21f40 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
21f50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
21f60 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
21f70 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  *zPath, .  int f
21f80 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52  lags, .  int *pR
21f90 65 73 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 61  esOut.){.  int a
21fa0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
21fb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
21fc0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
21fd0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
21fe0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
21ff0 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
22000 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
22010 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
22020 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
22030 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
22040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22050 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
22060 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
22070 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
22080 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
22090 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
220a0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
220b0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
220c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
220d0 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
220e0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
220f0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
22100 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
22110 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
22120 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
22130 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
22140 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
22150 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
22160 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
22170 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
22180 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
22190 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
221a0 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
221b0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
221c0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
221d0 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
221e0 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
221f0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
22200 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
22210 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
22220 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
22230 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
22240 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
22250 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
22260 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
22270 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
22280 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
22290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
222a0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
222b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
222c0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
222d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
222e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
222f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
22300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22310 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
22320 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
22330 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22350 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
22360 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
22370 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
223a0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
223b0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
223c0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
223d0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
223e0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
223f0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
22400 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
22410 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
22420 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
22430 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
22440 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
22450 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
22460 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
22470 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
22480 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
22490 20 64 69 72 65 63 74 6c 79 20 68 61 73 20 62 65   directly has be
224a0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
224b0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
224c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
224d0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
224e0 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
224f0 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
22500 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
22510 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
22520 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
22530 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
22540 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
22550 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
22560 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
22570 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
22580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
22590 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
225a0 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  getcwd(zOut, nOu
225b0 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
225c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
225d0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
225e0 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65 6e     nCwd = strlen
225f0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zOut);.    sqli
22600 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
22610 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43  t-nCwd, &zOut[nC
22620 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74  wd], "/%s", zPat
22630 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
22640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
22650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22660 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
22670 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
22680 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
22690 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
226a0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
226b0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
226c0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
226d0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
226e0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
226f0 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
22700 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
22710 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
22720 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
22730 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
22740 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
22750 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22760 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
22770 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
22780 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
22790 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
227a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
227b0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
227c0 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
227d0 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
227e0 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
227f0 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
22800 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
22810 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
22820 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
22830 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
22840 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
22850 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
22860 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
22870 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
22880 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
22890 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
228a0 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
228b0 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
228c0 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
228d0 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
228e0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
228f0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
22900 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
22910 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
22920 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t){.  char *zErr
22930 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
22940 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
22950 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
22960 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
22970 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
22980 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
22990 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
229a0 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
229b0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
229c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
229d0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
229e0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
229f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
22a00 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
22a10 74 20 63 68 61 72 2a 7a 53 79 6d 62 6f 6c 29 7b  t char*zSymbol){
22a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22a30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
22a40 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61  return dlsym(pHa
22a50 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
22a60 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
22a70 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
22a80 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
22a90 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
22aa0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
22ab0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
22ac0 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
22ad0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
22ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
22af0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
22b00 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
22b10 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
22b20 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
22b30 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
22b40 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
22b50 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
22b60 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
22b70 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
22b80 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
22b90 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
22ba0 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
22bb0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
22bc0 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
22bd0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
22be0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
22bf0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
22c00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22c10 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
22c20 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
22c30 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
22c40 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
22c50 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
22c60 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
22c70 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
22c80 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
22c90 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
22ca0 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
22cb0 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
22cc0 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
22cd0 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
22ce0 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
22cf0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
22d00 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
22d10 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
22d20 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
22d30 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
22d40 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
22d50 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
22d60 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
22d70 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
22d80 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
22d90 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
22da0 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
22db0 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
22dc0 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
22dd0 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
22de0 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
22df0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
22e00 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
22e10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
22e20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
22e30 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
22e40 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
22e50 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
22e60 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
22e70 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
22e80 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
22e90 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
22ea0 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
22eb0 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
22ec0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
22ed0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
22ee0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22ef0 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
22f00 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20  nt pid, fd;.    
22f10 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f  fd = open("/dev/
22f20 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
22f30 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  LY);.    if( fd<
22f40 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
22f50 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
22f60 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
22f70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
22f80 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
22f90 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
22fa0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
22fb0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
22fc0 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
22fd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
22fe0 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
22ff0 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
23000 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
23010 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
23020 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
23030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75  }else{.      nBu
23040 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75  f = read(fd, zBu
23050 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20  f, nBuf);.      
23060 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
23070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
23080 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
23090 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
230a0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
230b0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
230c0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
230d0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
230e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
230f0 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
23100 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
23110 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
23120 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
23130 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
23140 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
23150 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
23160 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
23170 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
23180 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
23190 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
231a0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
231b0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
231c0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
231d0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
231e0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
231f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
23200 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
23210 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
23220 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
23230 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
23240 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
23250 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
23260 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
23270 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
23280 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
23290 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
232a0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
232b0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
232c0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
232d0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
232e0 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
232f0 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
23300 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
23310 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74  oseconds);.  ret
23320 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
23330 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
23340 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
23350 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
23360 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
23370 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72  econds);.  retur
23380 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
23390 30 3b 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53  0;.#endif.  UNUS
233a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
233b0 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Used);.}../*.** 
233c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
233d0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
233e0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
233f0 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
23400 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
23410 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
23420 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
23430 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
23440 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
23450 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23460 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
23470 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
23480 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
23490 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
234a0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
234b0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
234c0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
234d0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
234e0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
234f0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
23500 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
23510 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
23520 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
23530 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
23540 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
23550 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
23560 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
23570 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
23580 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
23590 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
235a0 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
235b0 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
235c0 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30   *prNow = t/8640
235d0 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
235e0 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
235f0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
23600 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
23610 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
23620 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
23630 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
23640 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
23650 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
23660 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30  Now.tv_nsec/8640
23670 30 30 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65  0000000000.0;.#e
23680 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
23690 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74  eval sNow;.  get
236a0 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
236b0 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20   0);.  *prNow = 
236c0 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77  2440587.5 + sNow
236d0 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20  .tv_sec/86400.0 
236e0 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38  + sNow.tv_usec/8
236f0 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65  6400000000.0;.#e
23700 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
23710 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
23720 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
23730 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
23740 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
23750 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
23760 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
23770 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
23780 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
23790 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  sed);.  return 0
237a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
237b0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
237c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
237d0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
237e0 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
237f0 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
23800 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
23810 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
23820 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
23830 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23840 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
23850 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
23860 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
23870 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
23880 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
23890 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
238a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
238b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
238c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
238d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
238e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
238f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
23900 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
23910 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
23920 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
23930 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
23940 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
23950 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  all VFS implemen
23960 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78  tations for unix
23970 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a  -like operating.
23980 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69  ** systems.  Thi
23990 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74  s routine, and t
239a0 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  he sqlite3_os_en
239b0 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74  d() routine that
239c0 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f   follows,.** sho
239d0 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
239e0 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73  routines in this
239f0 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 76   file that are v
23a00 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65  isible from othe
23a10 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  r.** files..*/.i
23a20 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
23a30 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20  it(void){ .  /* 
23a40 4d 61 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20  Macro to define 
23a50 74 68 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65  the static conte
23a60 6e 74 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  nts of an sqlite
23a70 33 5f 76 66 73 20 73 74 72 75 63 74 75 72 65 20  3_vfs structure 
23a80 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69  for.  ** the uni
23a90 78 20 62 61 63 6b 65 6e 64 2e 20 54 68 65 20 74  x backend. The t
23aa0 77 6f 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  wo parameters ar
23ab0 65 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  e the values to 
23ac0 75 73 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  use for.  ** the
23ad0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61   sqlite3_vfs.zNa
23ae0 6d 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 76  me and sqlite3_v
23af0 66 73 2e 70 41 70 70 44 61 74 61 20 66 69 65 6c  fs.pAppData fiel
23b00 64 73 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ds, respectively
23b10 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23  ..  ** .  */.  #
23b20 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
23b30 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
23b40 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
23b50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31           \.    1
23b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23b70 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
23b80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23b90 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
23ba0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
23bb0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
23bc0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23bd0 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
23be0 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
23bf0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
23c00 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23c10 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c30 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c70 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23c90 0a 20 20 20 20 28 76 6f 69 64 2a 29 46 49 4e 44  .    (void*)FIND
23ca0 45 52 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 41  ER,        /* pA
23cb0 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23cd0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
23ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
23cf0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
23d00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23d10 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
23d20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
23d30 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
23d40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
23d50 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
23d60 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
23d70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23d80 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
23d90 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
23da0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
23db0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
23dc0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
23dd0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
23de0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
23e10 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
23e20 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
23e50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23e60 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23e80 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
23e90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
23ea0 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23ec0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
23ed0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
23ee0 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
23ef0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23f00 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
23f10 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
23f20 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23f30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
23f40 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
23f50 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
23f60 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
23f70 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
23f80 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  xGetLastError   
23f90 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
23fa0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
23fb0 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 75 6e       \.  }..  un
23fc0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
23fd0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
23fe0 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69  fs aVfs[] = {.#i
23ff0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24000 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
24010 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
24020 4e 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  N__).    UNIXVFS
24030 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
24040 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64    autolockIoFind
24050 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  er ),.#else.    
24060 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
24070 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f           posixIo
24080 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
24090 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
240a0 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f  ix-none",     no
240b0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
240c0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
240d0 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74  x-dotfile",  dot
240e0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
240f0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
24100 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
24110 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
24120 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
24130 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
24140 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24150 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
24160 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
24170 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
24180 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
24190 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
241a0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
241b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
241c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
241d0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
241e0 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20 20 20  __DARWIN__).    
241f0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66  UNIXVFS("unix-af
24200 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69  p",      afpIoFi
24210 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
24220 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22  VFS("unix-proxy"
24230 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  ,    proxyIoFind
24240 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  er ),.#endif.  }
24250 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  ;.  for(i=0; i<(
24260 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a  sizeof(aVfs)/siz
24270 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
24280 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
24290 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
242a0 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30  r(&aVfs[i], i==0
242b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
242c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
242d0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
242e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
242f0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68  em interface. Th
24300 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
24310 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  r unix..*/.int s
24320 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
24330 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
24340 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23  QLITE_OK; .}. .#
24350 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24360 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.