/ Hex Artifact Content
Login

Artifact 07c91dfdf6ae20014d1e7172cd648d3ae1dcebdf:


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 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 6e 64 65 66 20 54 48 52 45 41 44 53 41 46 45 0a  ndef THREADSAFE.
0740: 23 20 64 65 66 69 6e 65 20 54 48 52 45 41 44 53  # define THREADS
0750: 41 46 45 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  AFE 1.#endif.#if
0760: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
0770: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
0780: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0790: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
07a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
07b0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
07c0: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
07d0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
07e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
07f0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0800: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
0810: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0820: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
0830: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
0840: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
0850: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
0860: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
0870: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a  _PATHNAME 512...
0880: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
0890: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
08a0: 73 75 62 63 6c 61 73 73 20 6f 66 20 4f 73 46 69  subclass of OsFi
08b0: 6c 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20  le specific for 
08c0: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74  the unix.** prot
08d0: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
08e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
08f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
0900: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
0910: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
0920: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
0930: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
0940: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
0950: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
0960: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
0970: 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f  ;    /* Info abo
0980: 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73  ut all open fd's
0990: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
09a0: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  /.  struct lockI
09b0: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a  nfo *pLock;   /*
09c0: 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b   Info about lock
09d0: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
09e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
09f0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0a00: 53 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c 6f  STYLE.  void *lo
0a10: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
0a20: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
0a30: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
0a40: 65 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e */.#endif /* S
0a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0a60: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20  KING_STYLE */.  
0a70: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
0a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0a90: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
0aa0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0ab0: 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  har locktype;   
0ac0: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
0ad0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
0ae0: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
0af0: 64 20 63 68 61 72 20 69 73 4f 70 65 6e 3b 20 20  d char isOpen;  
0b00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
0b10: 65 64 73 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  eds to be closed
0b20: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
0b50: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
0b60: 74 6f 72 79 20 2a 2f 0a 20 20 69 36 34 20 6f 66  tory */.  i64 of
0b70: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
0b80: 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f 66 66 73      /* Seek offs
0b90: 65 74 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  et */.#ifdef SQL
0ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
0bb0: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64  .  pthread_t tid
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bd0: 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  The thread that 
0be0: 22 6f 77 6e 73 22 20 74 68 69 73 20 4f 73 46 69  "owns" this OsFi
0bf0: 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  le */.#endif.};.
0c00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
0c10: 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  the ability to o
0c20: 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f 53 2d  verride some OS-
0c30: 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  layer functions 
0c40: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
0c50: 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
0c60: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f 53 20   to simulate OS 
0c70: 63 72 61 73 68 65 73 20 74 6f 20 76 65 72 69 66  crashes to verif
0c80: 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d 6d 69  y that .** commi
0c90: 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20 65 76  ts are atomic ev
0ca0: 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  en in the event 
0cb0: 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68 2e 0a  of an OS crash..
0cc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0cd0: 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20 65 78  _CRASH_TEST.  ex
0ce0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0cf0: 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c 65 3b  CrashTestEnable;
0d00: 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  .  int sqlite3Cr
0d10: 61 73 68 46 69 6c 65 57 72 61 70 28 73 71 6c 69  ashFileWrap(sqli
0d20: 74 65 33 5f 66 69 6c 65 20 2a 2c 20 63 6f 6e 73  te3_file *, cons
0d30: 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65  t char *, sqlite
0d40: 33 5f 66 69 6c 65 20 2a 2a 29 3b 0a 20 20 73 74  3_file **);.  st
0d50: 61 74 69 63 20 69 6e 74 20 43 52 41 53 48 5f 54  atic int CRASH_T
0d60: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 63 6f 6e  EST_OVERRIDE(con
0d70: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
0d80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70  sqlite3_file **p
0d90: 49 64 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 20  Id, int rc){.   
0da0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
0db0: 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 43 72 61  OK && sqlite3Cra
0dc0: 73 68 54 65 73 74 45 6e 61 62 6c 65 20 29 7b 0a  shTestEnable ){.
0dd0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
0de0: 65 33 43 72 61 73 68 46 69 6c 65 57 72 61 70 28  e3CrashFileWrap(
0df0: 2a 70 49 64 2c 20 7a 46 69 6c 65 2c 20 70 49 64  *pId, zFile, pId
0e00: 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ); .    }.    re
0e10: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
0e20: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 52 41 53  se.# define CRAS
0e30: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
0e40: 41 2c 42 2c 43 29 20 43 0a 23 65 6e 64 69 66 0a  A,B,C) C.#endif.
0e50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
0e60: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
0e70: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
0e80: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
0e90: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
0ea0: 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  "../*.** Do not 
0eb0: 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20 74  include any of t
0ec0: 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74 65  he File I/O inte
0ed0: 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65 73  rface procedures
0ee0: 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54   if the.** SQLIT
0ef0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d 61  E_OMIT_DISKIO ma
0f00: 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 28  cro is defined (
0f10: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
0f20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
0f30: 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f 72  will be in-memor
0f40: 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e 64  y only).*/.#ifnd
0f50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0f60: 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  ISKIO.../*.** De
0f70: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
0f80: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
0f90: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
0fa0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
0fb0: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
0fc0: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
0fd0: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
0fe0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
0ff0: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
1000: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
1010: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
1020: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1030: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
1040: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
1050: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1060: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
1070: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1090: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
10a0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
10b0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
10c0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
10d0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
10e0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
10f0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
1100: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1110: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
1120: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
1130: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
1140: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
1150: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
1160: 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53 20  .  But it's DOS 
1170: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
1180: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
1190: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66   __DJGPP__.# def
11a0: 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29  ine fcntl(A,B,C)
11b0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
11c0: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
11d0: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
11e0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
11f0: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
1200: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
1210: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
1220: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1230: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23 64  _UNIX_THREADS.#d
1240: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
1250: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
1260: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
1270: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
1280: 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63  *.** Set or chec
1290: 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69 64  k the OsFile.tid
12a0: 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69   field.  This fi
12b0: 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20  eld is set when 
12c0: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73 20  an OsFile.** is 
12d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41  first opened.  A
12e0: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75 73  ll subsequent us
12f0: 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c 65  es of the OsFile
1300: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1310: 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20  .** same thread 
1320: 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  is operating on 
1330: 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f 6d  the OsFile.  Som
1340: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1350: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
1360: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
1370: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
1380: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
1390: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
13a0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
13b0: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
13c0: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
13d0: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
13e0: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
13f0: 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f  nother.  This lo
1400: 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61  gic makes sure a
1410: 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74   user does not t
1420: 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a  ry to do that.**
1430: 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a   by mistake..**.
1440: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
1450: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
1460: 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20 6d  OsFiles can be m
1470: 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68  oved from one th
1480: 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68  read to.** anoth
1490: 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  er as long as we
14a0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
14b0: 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  a system that su
14c0: 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a  pports threads.*
14d0: 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63  * overriding eac
14e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
14f0: 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d 6f  which now the mo
1500: 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69  st common behavi
1510: 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20  or).** or if no 
1520: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20  locks are held. 
1530: 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65 2e   But the OsFile.
1540: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
1550: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
1560: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
1570: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
1580: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
1590: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
15a0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
15b0: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
15c0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
15d0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
15e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
15f0: 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20 64  NIX_THREADS).# d
1600: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
1610: 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64  ID(X)   (X)->tid
1620: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
1630: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
1640: 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68  _THREADID(X) (th
1650: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
1660: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20  hOthersLocks==0 
1670: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  && \.           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
16a0: 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  (X)->tid, pthrea
16b0: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
16d0: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
16e0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
16f0: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
1700: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
1710: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
1720: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
1730: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
1740: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
1750: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
1760: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
1770: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
1780: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
1790: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
17a0: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
17b0: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
17c0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
17d0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
17e0: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
17f0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
1800: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
1810: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
1820: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
1830: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
1840: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
1850: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
1860: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
1870: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
1880: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
1890: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
18a0: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
18b0: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
18c0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
18d0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
18e0: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
18f0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1900: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
1910: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
1920: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
1930: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
1940: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
1950: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
1960: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
1970: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
1980: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
1990: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
19a0: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
19b0: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
19c0: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
19d0: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
19e0: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
19f0: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
1a00: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
1a10: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
1a20: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
1a30: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
1a40: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
1a50: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
1a60: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
1a70: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
1a80: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
1a90: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
1aa0: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
1ab0: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
1ac0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
1ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
1ae0: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
1af0: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
1b00: 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20  .** Bummer.  If 
1b10: 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73  you ask me, this
1b20: 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64   is broken.  Bad
1b30: 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d  ly broken.  It m
1b40: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20  eans.** that we 
1b50: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
1b60: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
1b70: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
1b80: 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65  s among.** compe
1b90: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
1ba0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1bb0: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
1bc0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
1bd0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
1be0: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
1bf0: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
1c00: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
1c10: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
1c20: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
1c30: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
1c40: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
1c50: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
1c60: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
1c70: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
1c80: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
1c90: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
1ca0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
1cb0: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
1cc0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
1cd0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
1ce0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cf0: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
1d00: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1d10: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
1d20: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
1d30: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
1d40: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
1d50: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
1d60: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
1d70: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
1d80: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
1d90: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
1da0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
1db0: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
1dc0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
1dd0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
1de0: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
1df0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
1e00: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
1e10: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
1e20: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
1e30: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
1e40: 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74  ** The OsFile st
1e50: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
1e60: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
1e70: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
1e80: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
1e90: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
1ea0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
1eb0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
1ec0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
1ed0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
1ee0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
1ef0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1f00: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
1f10: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
1f20: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
1f30: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
1f40: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1f50: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
1f60: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
1f70: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
1f80: 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c  wice, both OsFil
1f90: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
1fa0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
1fb0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
1fc0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
1fd0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
1fe0: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
1ff0: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
2000: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
2010: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
2020: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
2030: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
2040: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
2050: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
2060: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
2070: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
2080: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
2090: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
20a0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
20b0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
20c0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
20d0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
20e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
20f0: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
2100: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
2110: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
2120: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
2130: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
2140: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
2150: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
2160: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
2170: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
2180: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
2190: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
21a0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
21b0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
21c0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
21d0: 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a  .** 2004-Jan-11:
21e0: 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20  .** More recent 
21f0: 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75  discoveries abou
2200: 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  t POSIX advisory
2210: 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f   locks.  (The mo
2220: 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72  re.** I discover
2230: 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61  , the more I rea
2240: 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58  lize the a POSIX
2250: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2260: 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e  are.** an abomin
2270: 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66  ation.).**.** If
2280: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
2290: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
22a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
22b0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
22c0: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
22d0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
22e0: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
22f0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
2300: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
2310: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
2320: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
2330: 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74  , each OsFile st
2340: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
2350: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
2360: 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75   an openCnt stru
2370: 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69 73  cture.  There is
2380: 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   one openCnt str
2390: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70  ucture.** per op
23a0: 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20  en inode, which 
23b0: 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69  means that multi
23c0: 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20  ple OsFiles can 
23d0: 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
23e0: 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57  e.** openCnt.  W
23f0: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2400: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
2410: 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68  an OsFile, if th
2420: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
2430: 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e   OsFiles open on
2440: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
2450: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
2460: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
2470: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
2480: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2490: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
24a0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
24b0: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
24c0: 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  The openCnt stru
24d0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
24e0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
24f0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
2500: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
2510: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
2520: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
2530: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
2540: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
2550: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74  ars..**.** First
2560: 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68  , under Linux th
2570: 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20 65  reads, because e
2580: 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 61  ach thread has a
2590: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f   separate.** pro
25a0: 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70  cess ID, lock op
25b0: 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20  erations in one 
25c0: 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76  thread do not ov
25d0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
25e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
25f0: 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   in other thread
2600: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2610: 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a  s behave like.**
2620: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
2630: 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73 70  ses in this resp
2640: 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f  ect.  But, if yo
2650: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a  u close a file.*
2660: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20  * descriptor in 
2670: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61  linux threads, a
2680: 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65  ll locks are cle
2690: 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73  ared, even locks
26a0: 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72  .** on other thr
26b0: 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68  eads and even th
26c0: 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20 74  ough the other t
26d0: 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66 66  hreads have diff
26e0: 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73  erent.** process
26f0: 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72   IDs.  Linux thr
2700: 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73  eads is inconsis
2710: 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73  tent in this res
2720: 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65  pect..** (I'm be
2730: 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b  ginning to think
2740: 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65   that linux thre
2750: 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e  ads is an abomin
2760: 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54  ation too.).** T
2770: 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f  he consequence o
2780: 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68  f this all is th
2790: 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  at the hash tabl
27a0: 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e  e for the lockIn
27b0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
27c0: 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  has to include t
27d0: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61 73  he process id as
27e0: 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79   part of its key
27f0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b   because.** lock
2800: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74  s in different t
2810: 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61 74  hreads are treat
2820: 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20  ed as distinct. 
2830: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65   But the .** ope
2840: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 73  nCnt structure s
2850: 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64  hould not includ
2860: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64  e the process id
2870: 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62   in its.** key b
2880: 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63  ecause close() c
2890: 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c  lears lock on al
28a0: 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a  l threads, not j
28b0: 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ust the current.
28c0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72 65  ** thread.  Were
28d0: 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73   it not for this
28e0: 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69   goofiness in li
28f0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65 20  nux threads, we 
2900: 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65  could.** combine
2910: 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e   the lockInfo an
2920: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
2930: 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ures into a sing
2940: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  le structure..**
2950: 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a  .** 2004-Jun-28:
2960: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73  .** On some vers
2970: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74  ions of linux, t
2980: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
2990: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
29a0: 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68  locks..** On oth
29b0: 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69  ers not.  Someti
29c0: 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e  mes you can chan
29d0: 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ge the behavior 
29e0: 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  on the same.** s
29f0: 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67  ystem by setting
2a00: 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b   the LD_ASSUME_K
2a10: 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e  ERNEL environmen
2a20: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65  t variable.  The
2a30: 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61  .** POSIX standa
2a40: 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20  rd is silent as 
2a50: 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69 6f  to which behavio
2a60: 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73  r is correct, as
2a70: 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e   far.** as I can
2a80: 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20   tell, so other 
2a90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
2aa0: 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65 20   might show the 
2ab0: 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73  same.** inconsis
2ac0: 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73  tency.  There is
2ad0: 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74   no little doubt
2ae0: 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74   in my mind that
2af0: 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f   posix.** adviso
2b00: 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e  ry locks and lin
2b10: 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20 70  ux threads are p
2b20: 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e  rofoundly broken
2b30: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
2b40: 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e  around the incon
2b50: 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68  sistencies, we h
2b60: 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20 72  ave to test at r
2b70: 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68  untime .** wheth
2b80: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
2b90: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2ba0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2bb0: 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20  .  This test.** 
2bc0: 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65  is run once, the
2bd0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
2be0: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
2bf0: 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a  d.  A static .**
2c00: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
2c10: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72   to record the r
2c20: 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74  esults of this t
2c30: 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a  est for future.*
2c40: 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  * use..*/../*.**
2c50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2c60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2c70: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
2c80: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
2c90: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
2ca0: 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66  rticular lockInf
2cb0: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
2cc0: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
2cd0: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
2ce0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
2cf0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c  ch others locks,
2d00: 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68 65   then we set the
2d10: 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20  .** lockKey.tid 
2d20: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
2d30: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
2d40: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
2d50: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
2d60: 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69  locks then tid i
2d70: 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
2d80: 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d  zero.  tid is om
2d90: 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20 63  itted.** if we c
2da0: 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74  ompile without t
2db0: 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74  hreading support
2dc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b  ..*/.struct lock
2dd0: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
2de0: 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69  v;       /* Devi
2df0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
2e00: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
2e10: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
2e20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2e30: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
2e40: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
2e50: 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72   /* Thread ID or
2e60: 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64 73   zero if threads
2e70: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2e80: 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e 64  ch other */.#end
2e90: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
2ea0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2eb0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2ec0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
2ed0: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
2ee0: 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68 20  * inode on each 
2ef0: 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64 69  thread with a di
2f00: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2f10: 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68 61  ID.  (Threads ha
2f20: 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  ve.** different 
2f30: 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20 6c  process IDs on l
2f40: 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f 6e  inux, but not on
2f50: 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69 78   most other unix
2f60: 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  es.).**.** A sin
2f70: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
2f80: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
2f90: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
2fa0: 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a 20   each OsFile.** 
2fb0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
2fc0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
2fd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2fe0: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
2ff0: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
3000: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
3010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73 46  he number of OsF
3020: 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  iles pointing to
3030: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c   it..*/.struct l
3040: 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  ockInfo {.  stru
3050: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20  ct lockKey key; 
3060: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3070: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  ey */.  int cnt;
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3090: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
30a0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
30b0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
30c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
30d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
30e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
30f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3110: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
3120: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
3130: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
3140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3160: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
3170: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
3180: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
3190: 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73  icular openCnt s
31a0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
31b0: 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a  ts inode.  This.
31c0: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
31d0: 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78  s the lockKey ex
31e0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68  cept that the th
31f0: 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74  read ID is omitt
3200: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70  ed..*/.struct op
3210: 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20  enKey {.  dev_t 
3220: 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65  dev;   /* Device
3230: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f   number */.  ino
3240: 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f  _t ino;   /* Ino
3250: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a  de number */.};.
3260: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
3270: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3280: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
3290: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
32a0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
32b0: 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  e.  This structu
32c0: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
32d0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
32e0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a  locks on that.**
32f0: 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c   inode.  If a cl
3300: 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64  ose is attempted
3310: 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64   against an inod
3320: 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e  e that is holdin
3330: 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20  g.** locks, the 
3340: 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65  close is deferre
3350: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b  d until all lock
3360: 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e  s clear by addin
3370: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  g the.** file de
3380: 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63  scriptor to be c
3390: 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e  losed to the pen
33a0: 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  ding list..*/.st
33b0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20  ruct openCnt {. 
33c0: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
33d0: 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  key;   /* The lo
33e0: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
33f0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3410: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
3420: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
3430: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
3440: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3450: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
3460: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  locks */.  int n
3470: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
3480: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65   /* Number of pe
3490: 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70  nding close() op
34a0: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
34b0: 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20  t *aPending;    
34c0: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
34d0: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
34e0: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
34f0: 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ose() */.};../* 
3500: 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20 74  .** These hash t
3510: 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65 73  ables map inodes
3520: 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72 69   and file descri
3530: 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20 6c  ptors (really, l
3540: 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f 70  ockKey and.** op
3550: 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65 73  enKey structures
3560: 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f 20  ) into lockInfo 
3570: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
3580: 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73 20  ctures.  Access 
3590: 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61 73  to .** these has
35a0: 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  h tables must be
35b0: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
35c0: 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  mutex..*/.static
35d0: 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d   Hash lockHash =
35e0: 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49   {SQLITE_HASH_BI
35f0: 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30  NARY, 0, 0, 0, 0
3600: 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73  , 0};.static Has
3610: 68 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51  h openHash = {SQ
3620: 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59  LITE_HASH_BINARY
3630: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d  , 0, 0, 0, 0, 0}
3640: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
3650: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3660: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
3670: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61  locking styles a
3680: 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
3690: 74 68 20 74 68 65 20 64 69 66 66 65 72 65 6e 74  th the different
36a0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
36b0: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 73 75   capabilities su
36c0: 70 70 6f 72 74 65 64 20 62 79 20 64 69 66 66 65  pported by diffe
36d0: 72 65 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d  rent file system
36e0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  s.  .**.** POSIX
36f0: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66   locking style f
3700: 75 6c 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68  ully supports sh
3710: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
3720: 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
3730: 63 6b 73 20 0a 2a 2a 20 41 44 50 20 6c 6f 63 6b  cks .** ADP lock
3740: 69 6e 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ing only support
3750: 73 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  s exclusive byte
3760: 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20  -range locks.** 
3770: 46 4c 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f  FLOCK only suppo
3780: 72 74 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  rts a single fil
3790: 65 2d 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69  e-global exclusi
37a0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f  ve lock.** DOTLO
37b0: 43 4b 20 69 73 6e 27 74 20 61 20 74 72 75 65 20  CK isn't a true 
37c0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69  locking style, i
37d0: 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  t refers to the 
37e0: 75 73 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c  use of a special
37f0: 0a 2a 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64  .**   file named
3800: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
3810: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
3820: 69 74 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78  ith a '.lock' ex
3830: 74 65 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a  tension, this.**
3840: 20 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f     can be used o
3850: 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74  n file systems t
3860: 68 61 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72  hat do not offer
3870: 20 61 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69   any reliable fi
3880: 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f  le locking.** NO
3890: 20 6c 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74   locking means t
38a0: 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77  hat no locking w
38b0: 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64  ill be attempted
38c0: 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75  , this is only u
38d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61  sed for.**   rea
38e0: 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74  d-only file syst
38f0: 65 6d 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ems currently.**
3900: 20 55 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61   UNSUPPORTED mea
3910: 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69  ns that no locki
3920: 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d  ng will be attem
3930: 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e  pted, this is on
3940: 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ly used for.**  
3950: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68   file systems th
3960: 61 74 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20  at are known to 
3970: 62 65 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a  be unsupported.*
3980: 2f 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  /.typedef enum {
3990: 0a 20 20 20 20 20 20 20 20 70 6f 73 69 78 4c 6f  .        posixLo
39a0: 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20  ckingStyle = 0, 
39b0: 20 20 20 20 20 20 2f 2a 20 73 74 61 6e 64 61 72        /* standar
39c0: 64 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79  d posix-advisory
39d0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20   locks */.      
39e0: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c    afpLockingStyl
39f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
3a00: 2a 20 75 73 65 20 61 66 70 20 6c 6f 63 6b 73 20  * use afp locks 
3a10: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 6f 63 6b  */.        flock
3a20: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
3a30: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 66          /* use f
3a40: 6c 6f 63 6b 28 29 20 2a 2f 0a 20 20 20 20 20 20  lock() */.      
3a50: 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67    dotlockLocking
3a60: 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Style,         /
3a70: 2a 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63  * use <file>.loc
3a80: 6b 20 66 69 6c 65 73 20 2a 2f 0a 20 20 20 20 20  k files */.     
3a90: 20 20 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c     noLockingStyl
3aa0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3ab0: 2f 2a 20 75 73 65 66 75 6c 20 66 6f 72 20 72 65  /* useful for re
3ac0: 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73  ad-only file sys
3ad0: 74 65 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  tem */.        u
3ae0: 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e  nsupportedLockin
3af0: 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20 69  gStyle      /* i
3b00: 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70 6f  ndicates unsuppo
3b10: 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65 6d  rted file system
3b20: 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f 63   */.} sqlite3Loc
3b30: 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64 69  kingStyle;.#endi
3b40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
3b50: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3b60: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3b70: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20   enterMutex(){. 
3b80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
3b90: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
3ba0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
3bb0: 4d 55 54 45 58 5f 47 4c 4f 42 41 4c 29 29 3b 0a  MUTEX_GLOBAL));.
3bc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65  }.static void le
3bd0: 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 73 71  aveMutex(){.  sq
3be0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
3bf0: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
3c00: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
3c10: 45 58 5f 47 4c 4f 42 41 4c 29 29 3b 0a 7d 0a 0a  EX_GLOBAL));.}..
3c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
3c30: 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a 2a 2a  IX_THREADS./*.**
3c40: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72   This variable r
3c50: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f  ecords whether o
3c60: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
3c70: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3c80: 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e  others.** locks.
3c90: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f  .**.**    0:  No
3ca0: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f  .  Threads canno
3cb0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
3cc0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
3cd0: 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68      1:  Yes.  Th
3ce0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3cf0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
3d00: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20  ocks..**   -1:  
3d10: 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65  We don't know ye
3d20: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  t..**.** On some
3d30: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f   systems, we kno
3d40: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
3d50: 65 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e  e if threads can
3d60: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a   override each.*
3d70: 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20  * others locks. 
3d80: 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   On those system
3d90: 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48  s, the SQLITE_TH
3da0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
3db0: 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c  CK macro.** will
3dc0: 20 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69   be set appropri
3dd0: 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72  ately.  On other
3de0: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76   systems, we hav
3df0: 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a  e to check at.**
3e00: 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68   runtime.  On th
3e10: 65 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65  ese latter syste
3e20: 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41  ms, SQLTIE_THREA
3e30: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20  D_OVERRIDE_LOCK 
3e40: 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e  is.** undefined.
3e50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  .**.** This vari
3e60: 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61  able normally ha
3e70: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c  s file scope onl
3e80: 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74  y.  But during t
3e90: 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a  esting, we make.
3ea0: 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73  ** it a global s
3eb0: 6f 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  o that the test 
3ec0: 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20  code can change 
3ed0: 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64  its value in ord
3ee0: 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20  er to verify.** 
3ef0: 74 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73  that the right s
3f00: 74 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20  tuff happens in 
3f10: 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a  either case..*/.
3f20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
3f30: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3f40: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
3f50: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3f60: 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64  IDE_LOCK -1.#end
3f70: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
3f80: 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64  _TEST.int thread
3f90: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
3fa0: 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54  ersLocks = SQLIT
3fb0: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
3fc0: 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74  E_LOCK;.#else.st
3fd0: 61 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73  atic int threads
3fe0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
3ff0: 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45  rsLocks = SQLITE
4000: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
4010: 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK;.#endif../
4020: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
4030: 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d  ure holds inform
4040: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74  ation passed int
4050: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73  o individual tes
4060: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20  t.** threads by 
4070: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
4080: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
4090: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
40a0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
40b0: 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  a {.  int fd;   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  File to be locke
40e0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  d */.  struct fl
40f0: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a  ock lock;     /*
4100: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   The locking ope
4110: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
4120: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
4130: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
4140: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  the locking oper
4150: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ation */.};..#if
4160: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
4170: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
4180: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
4190: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
41a0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
41b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
41c0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
41d0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
41e0: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
41f0: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
4200: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
4210: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
4220: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
4230: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
4240: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
4250: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
4260: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
4270: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
4280: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
4290: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
42a0: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
42b0: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
42c0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
42d0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
42e0: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
42f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
4300: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4310: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
4320: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
4330: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
4340: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
4350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
4360: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
4370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4380: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4390: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
43a0: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
43b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
43c0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
43d0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
43e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
43f0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
4400: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4410: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4420: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
4430: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
4440: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
4450: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4460: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4470: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
4480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
4490: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
44a0: 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28   );.  s = fcntl(
44b0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
44c0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
44d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
44e0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
44f0: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
4500: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
4510: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
4520: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
4530: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
4540: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
4550: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
4560: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
4570: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
4580: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4590: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
45a0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
45b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
45c0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
45d0: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
45e0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
45f0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4600: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4610: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4620: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
4630: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4640: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
4650: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
4660: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4670: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
4680: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4690: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
46a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
46b0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
46c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
46d0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
46e0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
46f0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4700: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4710: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4720: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
4730: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
4740: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
4750: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
4760: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
4770: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
4780: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4790: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
47a0: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
47b0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
47c0: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
47d0: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
47e0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
47f0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4800: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4810: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4820: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
4830: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
4840: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
4850: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
4860: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
4870: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
4880: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4890: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
48a0: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
48b0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
48c0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
48d0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
48e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
48f0: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4900: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4910: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4920: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
4930: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
4940: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
4950: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
4960: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
4970: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
4980: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4990: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
49a0: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
49b0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
49c0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
49d0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
49e0: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
49f0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4a00: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4a10: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4a20: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
4a30: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
4a40: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
4a50: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
4a60: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
4a70: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
4a80: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a90: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4aa0: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4ab0: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4ac0: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4ad0: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4ae0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4af0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4b00: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4b10: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4b20: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4b30: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4b40: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4b50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4b60: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4b70: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4b80: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b90: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4ba0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4bb0: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4bc0: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4bd0: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4be0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4bf0: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4c00: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4c10: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4c20: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4c30: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4c40: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4c50: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4c60: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4c70: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4c80: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c90: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4ca0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4cb0: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4cd0: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4ce0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4cf0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4d00: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4d20: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4d30: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4d40: 63 6b 29 7b 0a 20 20 69 66 20 28 70 4c 6f 63 6b  ck){.  if (pLock
4d50: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4d60: 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e  turn;.  pLock->n
4d70: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f  Ref--;.  if( pLo
4d80: 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ck->nRef==0 ){. 
4d90: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4da0: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
4db0: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
4dc0: 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c  eof(pLock->key),
4dd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4de0: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
4df0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
4e00: 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73 74 72  se a openCnt str
4e10: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
4e20: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
4e30: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a  indLockInfo()..*
4e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
4e50: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72  leaseOpenCnt(str
4e60: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
4e70: 65 6e 29 7b 0a 20 20 69 66 20 28 70 4f 70 65 6e  en){.  if (pOpen
4e80: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4e90: 74 75 72 6e 3b 0a 20 20 70 4f 70 65 6e 2d 3e 6e  turn;.  pOpen->n
4ea0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f 70  Ref--;.  if( pOp
4eb0: 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  en->nRef==0 ){. 
4ec0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4ed0: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
4ee0: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
4ef0: 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29 2c  eof(pOpen->key),
4f00: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 70 4f   0);.    free(pO
4f10: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a  pen->aPending);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f30: 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pOpen);.  }.}..
4f40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4f50: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
4f60: 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74 73 20 61  LE./*.** Tests a
4f70: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
4f80: 69 6e 67 20 71 75 65 72 79 20 74 6f 20 73 65 65  ing query to see
4f90: 20 69 66 20 62 79 74 65 20 72 61 6e 67 65 20 6c   if byte range l
4fa0: 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20 73 75 70  ocks are .** sup
4fb0: 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f 74 20 77  ported, if not w
4fc0: 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 64  e fall back to d
4fd0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
4fe0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  le..*/.static sq
4ff0: 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c  lite3LockingStyl
5000: 65 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  e sqlite3TestLoc
5010: 6b 69 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20  kingStyle(const 
5020: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
5030: 0a 20 20 69 6e 74 20 66 64 29 20 7b 0a 20 20 2f  .  int fd) {.  /
5040: 2a 20 74 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * test byte-rang
5050: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
5060: 74 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66  tl */.  struct f
5070: 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 20  lock lockInfo;. 
5080: 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c   .  lockInfo.l_l
5090: 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
50a0: 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
50b0: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
50c0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
50d0: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
50e0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 0a  e = F_RDLCK;.  .
50f0: 20 20 69 66 20 28 66 63 6e 74 6c 28 66 64 2c 20    if (fcntl(fd, 
5100: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
5110: 66 6f 29 20 21 3d 20 2d 31 29 20 7b 0a 20 20 20  fo) != -1) {.   
5120: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63   return posixLoc
5130: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 20 0a  kingStyle;.  } .
5140: 20 20 0a 20 20 2f 2a 20 74 65 73 74 69 6e 67 20    .  /* testing 
5150: 66 6f 72 20 66 6c 6f 63 6b 20 63 61 6e 20 67 69  for flock can gi
5160: 76 65 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  ve false positiv
5170: 65 73 2e 20 20 53 6f 20 69 66 20 69 66 20 74 68  es.  So if if th
5180: 65 20 61 62 6f 76 65 20 74 65 73 74 0a 20 20 2a  e above test.  *
5190: 2a 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 77 65  * fails, then we
51a0: 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   fall back to us
51b0: 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b 20 73 74 79  ing dot-lock sty
51c0: 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 20 2a 2f  le locking..  */
51d0: 20 20 0a 20 20 72 65 74 75 72 6e 20 64 6f 74 6c    .  return dotl
51e0: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  ockLockingStyle;
51f0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 6d 69  .}../* .** Exami
5200: 6e 65 73 20 74 68 65 20 66 5f 66 73 74 79 70 65  nes the f_fstype
5210: 6e 61 6d 65 20 65 6e 74 72 79 20 69 6e 20 74 68  name entry in th
5220: 65 20 73 74 61 74 66 73 20 73 74 72 75 63 74 75  e statfs structu
5230: 72 65 20 61 73 20 72 65 74 75 72 6e 65 64 20 62  re as returned b
5240: 79 20 0a 2a 2a 20 73 74 61 74 28 29 20 66 6f 72  y .** stat() for
5250: 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
5260: 20 68 6f 73 74 69 6e 67 20 74 68 65 20 64 61 74   hosting the dat
5270: 61 62 61 73 65 20 66 69 6c 65 2c 20 61 73 73 69  abase file, assi
5280: 67 6e 73 20 74 68 65 20 0a 2a 2a 20 61 70 70 72  gns the .** appr
5290: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
52a0: 73 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 69  style based on i
52b0: 74 27 73 20 76 61 6c 75 65 2e 20 20 54 68 65 73  t's value.  Thes
52c0: 65 20 76 61 6c 75 65 73 20 61 6e 64 20 0a 2a 2a  e values and .**
52d0: 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 61 72 65   assignments are
52e0: 20 62 61 73 65 64 20 6f 6e 20 44 61 72 77 69 6e   based on Darwin
52f0: 2f 4f 53 58 20 62 65 68 61 76 69 6f 72 20 61 6e  /OSX behavior an
5300: 64 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  d have not been 
5310: 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74  tested on .** ot
5320: 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
5330: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f  static sqlite3Lo
5340: 63 6b 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74  ckingStyle sqlit
5350: 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53  e3DetectLockingS
5360: 74 79 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  tyle(const char 
5370: 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e  *filePath, .  in
5380: 74 20 66 64 29 20 7b 0a 0a 23 69 66 64 65 66 20  t fd) {..#ifdef 
5390: 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43  SQLITE_FIXED_LOC
53a0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 72 65 74  KING_STYLE.  ret
53b0: 75 72 6e 20 28 73 71 6c 69 74 65 33 4c 6f 63 6b  urn (sqlite3Lock
53c0: 69 6e 67 53 74 79 6c 65 29 53 51 4c 49 54 45 5f  ingStyle)SQLITE_
53d0: 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54  FIXED_LOCKING_ST
53e0: 59 4c 45 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  YLE;.#else.  str
53f0: 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
5400: 6f 3b 0a 0a 20 20 69 66 20 28 73 74 61 74 66 73  o;..  if (statfs
5410: 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
5420: 66 6f 29 20 3d 3d 20 2d 31 29 0a 20 20 20 20 72  fo) == -1).    r
5430: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73  eturn sqlite3Tes
5440: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69  tLockingStyle(fi
5450: 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a  lePath, fd);.  .
5460: 20 20 69 66 20 28 66 73 49 6e 66 6f 2e 66 5f 66    if (fsInfo.f_f
5470: 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
5480: 59 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 6f  Y).    return no
5490: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
54a0: 0a 20 20 69 66 28 20 28 21 73 74 72 63 6d 70 28  .  if( (!strcmp(
54b0: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
54c0: 61 6d 65 2c 20 22 68 66 73 22 29 29 20 7c 7c 0a  ame, "hfs")) ||.
54d0: 20 20 20 20 28 21 73 74 72 63 6d 70 28 66 73 49      (!strcmp(fsI
54e0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
54f0: 2c 20 22 75 66 73 22 29 29 20 29 0a 20 20 20 20  , "ufs")) ).    
5500: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5510: 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53  rn posixLockingS
5520: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73  tyle;.  .  if(!s
5530: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
5540: 73 74 79 70 65 6e 61 6d 65 2c 20 22 61 66 70 66  stypename, "afpf
5550: 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  s")).    return 
5560: 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  afpLockingStyle;
5570: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
5580: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
5590: 6e 61 6d 65 2c 20 22 6e 66 73 22 29 29 20 0a 20  name, "nfs")) . 
55a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
55b0: 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  3TestLockingStyl
55c0: 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b  e(filePath, fd);
55d0: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
55e0: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
55f0: 6e 61 6d 65 2c 20 22 73 6d 62 66 73 22 29 29 0a  name, "smbfs")).
5600: 20 20 20 20 72 65 74 75 72 6e 20 66 6c 6f 63 6b      return flock
5610: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5620: 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73  .  if(!strcmp(fs
5630: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
5640: 65 2c 20 22 6d 73 64 6f 73 22 29 29 0a 20 20 20  e, "msdos")).   
5650: 20 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c   return dotlockL
5660: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5670: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
5680: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5690: 2c 20 22 77 65 62 64 61 76 22 29 29 0a 20 20 20  , "webdav")).   
56a0: 20 72 65 74 75 72 6e 20 75 6e 73 75 70 70 6f 72   return unsuppor
56b0: 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  tedLockingStyle;
56c0: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .  .  return sql
56d0: 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53  ite3TestLockingS
56e0: 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20 66  tyle(filePath, f
56f0: 64 29 3b 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20  d);  .#endif /* 
5700: 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43  SQLITE_FIXED_LOC
5710: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 7d 0a  KING_STYLE */.}.
5720: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5730: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
5740: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
5750: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
5760: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
5770: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
5780: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
5790: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
57a0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
57b0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
57c0: 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63   new ones if nec
57d0: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
57e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69  return values mi
57f0: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
5800: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
5810: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52   occurs..**.** R
5820: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5830: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
5840: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f  tatic int findLo
5850: 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64  ckInfo(.  int fd
5860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5870: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
5880: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
5890: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
58a0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
58b0: 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20  fo **ppLock,    
58c0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f  /* Return the lo
58d0: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
58e0: 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
58f0: 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70  t openCnt **ppOp
5900: 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  en      /* Retur
5910: 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74  n the openCnt st
5920: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
5930: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
5940: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65  truct lockKey ke
5950: 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  y1;.  struct ope
5960: 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72  nKey key2;.  str
5970: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
5980: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
5990: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
59a0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
59b0: 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  pen;.  rc = fsta
59c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
59d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72  .  if( rc!=0 ) r
59e0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 6d 65 6d 73  eturn 1;..  mems
59f0: 65 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a  et(&key1, 0, siz
5a00: 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65  eof(key1));.  ke
5a10: 79 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  y1.dev = statbuf
5a20: 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e  .st_dev;.  key1.
5a30: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
5a40: 5f 69 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c  _ino;.#ifdef SQL
5a50: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
5a60: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
5a70: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
5a80: 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74  Locks<0 ){.    t
5a90: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
5aa0: 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20  Behavior(fd);.  
5ab0: 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74  }.  key1.tid = t
5ac0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
5ad0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20  chOthersLocks ? 
5ae0: 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66  0 : pthread_self
5af0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d  ();.#endif.  mem
5b00: 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69  set(&key2, 0, si
5b10: 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b  zeof(key2));.  k
5b20: 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75  ey2.dev = statbu
5b30: 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32  f.st_dev;.  key2
5b40: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
5b50: 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d  t_ino;.  pLock =
5b60: 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66   (struct lockInf
5b70: 6f 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  o*)sqlite3HashFi
5b80: 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b  nd(&lockHash, &k
5b90: 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31  ey1, sizeof(key1
5ba0: 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ));.  if( pLock=
5bb0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
5bc0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b   lockInfo *pOld;
5bd0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c  .    pLock = sql
5be0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
5bf0: 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20  eof(*pLock) );. 
5c00: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
5c10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
5c20: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
5c30: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
5c40: 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e     }.    pLock->
5c50: 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20  key = key1;.    
5c60: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b  pLock->nRef = 1;
5c70: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  .    pLock->cnt 
5c80: 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = 0;.    pLock->
5c90: 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20  locktype = 0;.  
5ca0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
5cb0: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
5cc0: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
5cd0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c  y, sizeof(key1),
5ce0: 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   pLock);.    if(
5cf0: 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20   pOld!=0 ){.    
5d00: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
5d10: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73  pLock );.      s
5d20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
5d30: 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  k);.      rc = 1
5d40: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
5d50: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
5d60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5d70: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
5d80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20  ;.  }.  *ppLock 
5d90: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70  = pLock;.  if( p
5da0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
5db0: 70 4f 70 65 6e 20 3d 20 28 73 74 72 75 63 74 20  pOpen = (struct 
5dc0: 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33  openCnt*)sqlite3
5dd0: 48 61 73 68 46 69 6e 64 28 26 6f 70 65 6e 48 61  HashFind(&openHa
5de0: 73 68 2c 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f  sh, &key2, sizeo
5df0: 66 28 6b 65 79 32 29 29 3b 0a 20 20 20 20 69 66  f(key2));.    if
5e00: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
5e10: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
5e20: 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20  nt *pOld;.      
5e30: 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pOpen = sqlite3_
5e40: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
5e50: 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  pOpen) );.      
5e60: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
5e70: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c          releaseL
5e80: 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a  ockInfo(pLock);.
5e90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
5ea0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
5eb0: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
5ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
5ed0: 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b  pen->key = key2;
5ee0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
5ef0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ef = 1;.      pO
5f00: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a  pen->nLock = 0;.
5f10: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
5f20: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5f30: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
5f40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64   = 0;.      pOld
5f50: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5f60: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
5f70: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
5f80: 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e  eof(key2), pOpen
5f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c  );.      if( pOl
5fa0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d!=0 ){.        
5fb0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f  assert( pOld==pO
5fc0: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pen );.        s
5fd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
5fe0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  n);.        rele
5ff0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63  aseLockInfo(pLoc
6000: 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  k);.        rc =
6010: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
6020: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
6030: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
6040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70  }else{.      pOp
6050: 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  en->nRef++;.    
6060: 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20  }.    *ppOpen = 
6070: 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74  pOpen;.  }..exit
6080: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20  _findlockinfo:. 
6090: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
60a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
60b0: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
60c0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
60d0: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
60e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
60f0: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
6100: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
6110: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
6120: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
6130: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
6140: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
6150: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
6160: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79  nst char *lockty
6170: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
6180: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
6190: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
61a0: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
61b0: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
61c0: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
61d0: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
61e0: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
61f0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
6200: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
6210: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
6220: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
6230: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
6240: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
6250: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
6260: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
6270: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6280: 20 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65   If we are curre
6290: 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72  ntly in a differ
62a0: 65 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20  ent thread than 
62b0: 74 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  the thread that 
62c0: 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20  the.** unixFile 
62d0: 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73  argument belongs
62e0: 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66   to, then transf
62f0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
6300: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
6310: 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72  over to the curr
6320: 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ent thread..**.*
6330: 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20  * A unixFile is 
6340: 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20  only owned by a 
6350: 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d  thread on system
6360: 73 20 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65  s where one thre
6370: 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ad is.** unable 
6380: 74 6f 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  to override lock
6390: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 64  s created by a d
63a0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e  ifferent thread.
63b0: 20 20 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20    RedHat9 is.** 
63c0: 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75  an example of su
63d0: 63 68 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a  ch a system..**.
63e0: 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  ** Ownership tra
63f0: 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c  nsfer is only al
6400: 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75 6e 69  lowed if the uni
6410: 78 46 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74  xFile is current
6420: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20  ly unlocked..** 
6430: 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  If the unixFile 
6440: 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e  is locked and an
6450: 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20 77 72   ownership is wr
6460: 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ong, then return
6470: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  .** SQLITE_MISUS
6480: 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  E.  SQLITE_OK is
6490: 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
64a0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a  rything works..*
64b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
64c0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61  UNIX_THREADS.sta
64d0: 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72  tic int transfer
64e0: 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69  Ownership(unixFi
64f0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
6500: 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f  t rc;.  pthread_
6510: 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74  t hSelf;.  if( t
6520: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
6530: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b  chOthersLocks ){
6540: 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69  .    /* Ownershi
6550: 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20  p transfers not 
6560: 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73  needed on this s
6570: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74  ystem */.    ret
6580: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6590: 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68   }.  hSelf = pth
65a0: 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69  read_self();.  i
65b0: 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c  f( pthread_equal
65c0: 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65  (pFile->tid, hSe
65d0: 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  lf) ){.    /* We
65e0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
65f0: 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f  e same thread */
6600: 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e  .    OSTRACE1("N
6610: 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65  o-transfer, same
6620: 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20   thread\n");.   
6630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6640: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  K;.  }.  if( pFi
6650: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
6660: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
6670: 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65  We cannot change
6680: 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65   ownership while
6690: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
66a0: 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72  a lock! */.    r
66b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
66c0: 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  USE;.  }.  OSTRA
66d0: 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77  CE4("Transfer ow
66e0: 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66 72  nership of %d fr
66f0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
6700: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
6710: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64  e->h, pFile->tid
6720: 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c  , hSelf);.  pFil
6730: 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a  e->tid = hSelf;.
6740: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f    if (pFile->pLo
6750: 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  ck != NULL) {.  
6760: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
6770: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
6780: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
6790: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c  ckInfo(pFile->h,
67a0: 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20   &pFile->pLock, 
67b0: 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35  0);.    OSTRACE5
67c0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20  ("LOCK    %d is 
67d0: 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22  now %s(%s,%d)\n"
67e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
67f0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
6800: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
6810: 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ype),.          
6820: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
6830: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
6840: 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c  type), pFile->pL
6850: 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72  ock->cnt);.    r
6860: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
6870: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
6880: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
6890: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73  .#else.  /* On s
68a0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62  ingle-threaded b
68b0: 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70  uilds, ownership
68c0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e   transfer is a n
68d0: 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65  o-op */.# define
68e0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
68f0: 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ip(X) SQLITE_OK.
6900: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
6910: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
6920: 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ile.*/.int sqlit
6930: 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e  e3UnixDelete(con
6940: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6950: 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49  me){.  SimulateI
6960: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
6970: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
6980: 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  E);.  unlink(zFi
6990: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
69b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
69c0: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
69d0: 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ile exists..*/.i
69e0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 46 69  nt sqlite3UnixFi
69f0: 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63  leExists(const c
6a00: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
6a10: 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
6a20: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d  (zFilename, 0)==
6a30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  0;.}../*.** Atte
6a40: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69  mpt to open a fi
6a50: 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  le for both read
6a60: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
6a70: 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69    If that.** fai
6a80: 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20  ls, try opening 
6a90: 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49  it read-only.  I
6aa0: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
6ab0: 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72  not exist,.** tr
6ac0: 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a  y to create it..
6ad0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
6ae0: 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  , a handle for t
6af0: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20  he open file is 
6b00: 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a  written to *id.*
6b10: 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  * and *pReadonly
6b20: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
6b30: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
6b40: 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ned for reading 
6b50: 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f  and.** writing o
6b60: 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  r 1 if the file 
6b70: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d  was opened read-
6b80: 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74  only.  The funct
6b90: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  ion returns.** S
6ba0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
6bb0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
6bc0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6bd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6be0: 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   and leaves.** *
6bf0: 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  id and *pReadonl
6c00: 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  y unchanged..*/.
6c10: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
6c20: 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72 69  3UnixOpenReadWri
6c30: 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te(.  const char
6c40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 73   *zFilename,.  s
6c50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49  qlite3_file **pI
6c60: 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f  d,.  int *pReado
6c70: 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a  nly.){.  int h;.
6c80: 20 20 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d    .  assert( 0==
6c90: 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70  *pId );.  h = op
6ca0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  en(zFilename, O_
6cb0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c  RDWR|O_CREAT|O_L
6cc0: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6cd0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
6ce0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6cf0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
6d00: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
6d10: 66 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66  f( h<0 ){.#ifdef
6d20: 20 45 49 53 44 49 52 0a 20 20 20 20 69 66 28 20   EISDIR.    if( 
6d30: 65 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b  errno==EISDIR ){
6d40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6d50: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
6d60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6d70: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
6d80: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
6d90: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6da0: 59 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20  Y);.    if( h<0 
6db0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6dc0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
6dd0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65   .    }.    *pRe
6de0: 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65  adonly = 1;.  }e
6df0: 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f  lse{.    *pReado
6e00: 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nly = 0;.  }..  
6e10: 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45 53  return CRASH_TES
6e20: 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20 20  T_OVERRIDE(.    
6e30: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20  zFilename, pId, 
6e40: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
6e50: 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61  (h, pId, zFilena
6e60: 6d 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 0a 0a  me, 0).  );.}...
6e70: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
6e80: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
6e90: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
6ea0: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
6eb0: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
6ec0: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
6ed0: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
6ee0: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
6ef0: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
6f00: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
6f10: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
6f20: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
6f30: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
6f40: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
6f50: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
6f60: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
6f70: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
6f80: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
6f90: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
6fa0: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
6fb0: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
6fc0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
6fd0: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
6fe0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
6ff0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
7000: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
7010: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
7020: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
7030: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
7040: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
7050: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
7060: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
7070: 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  ixOpenExclusive(
7080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7090: 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
70a0: 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49 64 2c  ite3_file **pId,
70b0: 20 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 0a   .  int delFlag.
70c0: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  ){.  int h;..  a
70d0: 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20 29  ssert( 0==*pId )
70e0: 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46 69  ;.  h = open(zFi
70f0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
7100: 20 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f          O_RDWR|O
7110: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f  _CREAT|O_EXCL|O_
7120: 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45  NOFOLLOW|O_LARGE
7130: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20  FILE|O_BINARY,. 
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
7150: 65 6c 46 6c 61 67 20 3f 20 30 36 30 30 20 3a 20  elFlag ? 0600 : 
7160: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
7170: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
7180: 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20  ;.  if( h<0 ){. 
7190: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
71a0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
71b0: 20 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45   return CRASH_TE
71c0: 53 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20  ST_OVERRIDE(.   
71d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c   zFilename, pId,
71e0: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
71f0: 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e  e(h, pId, zFilen
7200: 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 0a 20 20  ame, delFlag).  
7210: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  );.}../*.** Atte
7220: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  mpt to open a ne
7230: 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d  w file for read-
7240: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a  only access..**.
7250: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
7260: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
7270: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
7280: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
7290: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
72a0: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
72b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
72c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
72d0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
72e0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
72f0: 6d 65 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  me, sqlite3_file
7300: 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 68   **pId){.  int h
7310: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 30  ;.  .  assert( 0
7320: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20  ==*pId );.  h = 
7330: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
7340: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
7350: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
7360: 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20 20    if( h<0 ){.   
7370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7380: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72  ANTOPEN;.  }.  r
7390: 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45 53 54  eturn CRASH_TEST
73a0: 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20 20 7a  _OVERRIDE(.    z
73b0: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 61  Filename, pId, a
73c0: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
73d0: 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d  h, pId, zFilenam
73e0: 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 23 65 6e  e, 0).  );.}.#en
73f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  dif../*.** Attem
7400: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
7410: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7420: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
7430: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
7440: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
7450: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
7460: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
7470: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
7480: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
7490: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
74a0: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
74b0: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
74c0: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
74d0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
74e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
74f0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
7500: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
7510: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
7520: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
7530: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
7540: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
7550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 46 55 4c 4c 5f  ..**.** If FULL_
7560: 46 53 59 4e 43 20 69 73 20 65 6e 61 62 6c 65 64  FSYNC is enabled
7570: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
7580: 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20 75 73  is not longer us
7590: 65 66 75 6c 2c 20 0a 2a 2a 20 61 20 46 55 4c 4c  eful, .** a FULL
75a0: 5f 46 53 59 4e 43 20 73 79 6e 63 20 61 70 70 6c  _FSYNC sync appl
75b0: 69 65 73 20 74 6f 20 61 6c 6c 20 70 65 6e 64 69  ies to all pendi
75c0: 6e 67 20 64 69 73 6b 20 6f 70 65 72 61 74 69 6f  ng disk operatio
75d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ns..**.** On suc
75e0: 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66  cess, a handle f
75f0: 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
7600: 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 2a 69 64  open file at *id
7610: 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77   is.** updated w
7620: 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72 65  ith the new dire
7630: 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
7640: 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45  iptor and SQLITE
7650: 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  _OK is.** return
7660: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  ed..**.** On fai
7670: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
7680: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
7690: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
76a0: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63  eaves.** *id unc
76b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 20 30  hanged..*/.#if 0
76c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
76d0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20  OpenDirectory(. 
76e0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63   OsFile *id,.  c
76f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
7700: 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a  ame.){.  int h;.
7710: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
7720: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
7730: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
7740: 6c 65 21 3d 30 20 29 3b 0a 20 20 53 45 54 5f 54  le!=0 );.  SET_T
7750: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a  HREADID(pFile);.
7760: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
7770: 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46  >dirfd<0 );.  pF
7780: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 68 20 3d  ile->dirfd = h =
7790: 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20   open(zDirname, 
77a0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
77b0: 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 68 3c 30  Y, 0);.  if( h<0
77c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
77d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
77e0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 46 44 5f 43  .  }.#ifdef FD_C
77f0: 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68  LOEXEC.  fcntl(h
7800: 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
7810: 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  (h, F_GETFD, 0) 
7820: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
7830: 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33  endif.  OSTRACE3
7840: 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
7850: 73 5c 6e 22 2c 20 68 2c 20 7a 44 69 72 6e 61 6d  s\n", h, zDirnam
7860: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
7870: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
7880: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
7890: 61 74 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e  at a given pathn
78a0: 61 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f  ame is a directo
78b0: 72 79 20 61 6e 64 20 69 73 20 77 72 69 74 61 62  ry and is writab
78c0: 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  le .**.*/.int sq
78d0: 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72 57 72  lite3UnixIsDirWr
78e0: 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75  itable(char *zBu
78f0: 66 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f){.#ifndef SQLI
7900: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
7910: 41 47 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73  AGMAS.  struct s
7920: 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a  tat buf;.  if( z
7930: 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
7940: 30 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d  0;.  if( zBuf[0]
7950: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7960: 20 20 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c    if( stat(zBuf,
7970: 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
7980: 30 3b 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49  0;.  if( !S_ISDI
7990: 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
79a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
79b0: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37   access(zBuf, 07
79c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
79d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
79e0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
79f0: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  S */.  return 1;
7a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
7a10: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
7a20: 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
7a30: 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
7a40: 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
7a50: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7a60: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
7a70: 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
7a80: 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74  he offset..*/.st
7a90: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
7aa0: 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
7ab0: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
7ac0: 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
7ad0: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
7ae0: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
7af0: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
7b00: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
7b10: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
7b20: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
7b30: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
7b40: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
7b50: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
7b60: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
7b70: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
7b80: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
7b90: 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
7ba0: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
7bb0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7bc0: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
7bd0: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
7be0: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
7bf0: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
7c00: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
7c10: 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
7c20: 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
7c30: 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
7c40: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
7c50: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
7c60: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
7c70: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
7c80: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
7c90: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
7ca0: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
7cb0: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e  id->h, got, id->
7cc0: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
7cd0: 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
7ce0: 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   got;.}../*.** R
7cf0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
7d00: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
7d10: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
7d20: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
7d30: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
7d40: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
7d50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
7d60: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
7d70: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
7d80: 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
7d90: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7da0: 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
7db0: 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
7dc0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7dd0: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20  offset.){.  int 
7de0: 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
7df0: 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65  d );.  got = see
7e00: 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
7e10: 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20  le*)id, offset, 
7e20: 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
7e30: 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
7e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e50: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
7e60: 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  got<0 ){.    ret
7e70: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7e80: 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
7e90: 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
7ea0: 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
7eb0: 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
7ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7ed0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
7ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
7ef0: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
7f00: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
7f10: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
7f20: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
7f30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7f40: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
7f50: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
7f60: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
7f70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
7f80: 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
7f90: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
7fa0: 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
7fb0: 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
7fc0: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34    int got;.  i64
7fd0: 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49   newOffset;.  TI
7fe0: 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
7ff0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
8000: 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
8010: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
8020: 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69  t, offset);.#eli
8030: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
8040: 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
8050: 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
8060: 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
8070: 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
8080: 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
8090: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
80a0: 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77  _SET);.  if( new
80b0: 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
80c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
80d0: 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
80e0: 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
80f0: 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
8100: 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
8110: 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d  ACE5("WRITE   %-
8120: 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c  3d %5d %7lld %d\
8130: 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
8140: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
8150: 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
8160: 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
8170: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
8180: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
8190: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
81a0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
81b0: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
81c0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
81d0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
81e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
81f0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
8200: 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
8210: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
8220: 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
8230: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
8240: 0a 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  .){.  int wrote 
8250: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
8260: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
8270: 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  mt>0 );.  while(
8280: 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
8290: 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
82a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f  (unixFile*)id, o
82b0: 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
82c0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
82d0: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
82e0: 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
82f0: 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
8300: 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
8310: 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
8320: 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
8330: 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
8340: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
8350: 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
8360: 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
8370: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
8380: 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
8390: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83a0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
83b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
83c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
83d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
83e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
83f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8400: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
8410: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
8420: 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
8430: 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
8440: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
8450: 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
8460: 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
8470: 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
8480: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
8490: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
84a0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
84b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
84c0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
84d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
84e0: 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28  e the fdatasync(
84f0: 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68  ) API only if th
8500: 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  e HAVE_FDATASYNC
8510: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
8520: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  d..** Otherwise 
8530: 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69  use fsync() in i
8540: 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66  ts place..*/.#if
8550: 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53  ndef HAVE_FDATAS
8560: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
8570: 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
8580: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
8590: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
85a0: 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
85b0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
85c0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
85d0: 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
85e0: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
85f0: 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
8600: 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
8610: 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
8620: 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
8630: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
8640: 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
8650: 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
8660: 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
8670: 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
8680: 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
8690: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
86a0: 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
86b0: 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
86c0: 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
86d0: 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
86e0: 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
86f0: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
8700: 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
8710: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
8720: 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
8730: 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
8740: 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
8750: 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
8760: 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
8770: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
8780: 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
8790: 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
87a0: 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
87b0: 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
87c0: 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
87d0: 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
87e0: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
87f0: 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
8800: 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
8810: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
8820: 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
8830: 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
8840: 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
8850: 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
8860: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8880: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
8890: 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
88a0: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
88b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
88c0: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
88d0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
88e0: 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
88f0: 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
8900: 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
8910: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
8920: 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
8930: 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
8940: 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
8950: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
8960: 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
8970: 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
8980: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
8990: 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
89a0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
89b0: 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
89c0: 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
89d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
89e0: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
89f0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
8a00: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
8a10: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
8a20: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
8a30: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
8a40: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
8a50: 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41  K;.#else..#if HA
8a60: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
8a70: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
8a80: 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64     rc = fcntl(fd
8a90: 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
8aa0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8ab0: 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
8ac0: 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
8ad0: 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
8ae0: 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
8af0: 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
8b00: 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20   * It shouldn't 
8b10: 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
8b20: 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
8b30: 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
8b40: 20 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d     * file system
8b50: 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
8b60: 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
8b70: 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
8b80: 20 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72    * isn't suppor
8b90: 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
8ba0: 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
8bb0: 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
8bc0: 20 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f     * and (for no
8bd0: 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
8be0: 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
8bf0: 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
8c00: 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20  ll.  .   * It'd 
8c10: 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
8c20: 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
8c30: 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
8c40: 76 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66  void .   * the f
8c50: 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
8c60: 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
8c70: 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  led..   */.  if(
8c80: 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
8c90: 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20  (fd);..#else .  
8ca0: 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a  if( dataOnly ){.
8cb0: 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79      rc = fdatasy
8cc0: 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  nc(fd);.  }else{
8cd0: 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
8ce0: 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
8cf0: 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  /* HAVE_FULLFSYN
8d00: 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  C */.#endif /* d
8d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
8d20: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
8d30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8d40: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
8d50: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
8d60: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
8d70: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
8d80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
8d90: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
8da0: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
8db0: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
8dc0: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
8dd0: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
8de0: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
8df0: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
8e00: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
8e10: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
8e20: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
8e30: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
8e40: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
8e50: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
8e60: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
8e70: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
8e80: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
8e90: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
8ea0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
8eb0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
8ec0: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
8ed0: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
8ee0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
8ef0: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
8f00: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
8f10: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
8f20: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
8f30: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
8f40: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
8f50: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
8f60: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
8f70: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
8f80: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
8f90: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
8fa0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
8fb0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
8fc0: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
8fd0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
8fe0: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
8ff0: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
9000: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
9010: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
9020: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
9030: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9040: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
9050: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
9060: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
9070: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
9080: 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
9090: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
90a0: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
90b0: 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
90c0: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
90d0: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a  TE_SYNC_FULL);..
90e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
90f0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53  );.  OSTRACE2("S
9100: 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
9110: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20  pFile->h);.  rc 
9120: 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
9130: 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
9140: 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
9150: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9160: 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
9170: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
9180: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
9190: 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SYNC;.  }.  if( 
91a0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
91b0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  ){.    OSTRACE4(
91c0: 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
91d0: 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
91e0: 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
91f0: 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
9200: 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
9210: 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
9220: 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66  llsync);.#ifndef
9230: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
9240: 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
9250: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
9260: 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
9270: 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
9280: 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
9290: 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
92a0: 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
92b0: 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
92c0: 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
92d0: 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
92e0: 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
92f0: 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
9300: 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
9310: 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c  LFSYNC || !isFul
9320: 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lsync) && full_f
9330: 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
9340: 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
9350: 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
9360: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
9370: 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
9380: 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
9390: 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
93a0: 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
93b0: 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
93c0: 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
93d0: 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
93e0: 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
93f0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
9400: 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
9410: 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
9420: 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
9430: 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
9440: 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
9450: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
9460: 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    /* return SQLI
9470: 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20  TE_IOERR; */.   
9480: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c   }.#endif.    cl
9490: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
94a0: 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  );  /* Only need
94b0: 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
94c0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65  o close the dire
94d0: 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69  ctory */.    pFi
94e0: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20  le->dirfd = -1; 
94f0: 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72     /* when we ar
9500: 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20  e done. */.  }. 
9510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9520: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
9530: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a   the directory z
9540: 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  Dirname. This is
9550: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72   a no-op on oper
9560: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74  ating systems ot
9570: 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58  her.** than UNIX
9580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9590: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
95a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
95b0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72  rnal file has tr
95c0: 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65  uely been delete
95d0: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69  d.** before maki
95e0: 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e  ng changes to in
95f0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
9600: 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74  s on a multi-dat
9610: 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a  abase commit..**
9620: 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   The F_FULLFSYNC
9630: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e   option is not n
9640: 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69  eeded here..*/.i
9650: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79  nt sqlite3UnixSy
9660: 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  ncDirectory(cons
9670: 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  t char *zDirname
9680: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
9690: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
96a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
96b0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
96c0: 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20   fd;.  int r;.  
96d0: 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
96e0: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
96f0: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 4f 53 54  INARY, 0);.  OST
9700: 52 41 43 45 33 28 22 44 49 52 53 59 4e 43 20 25  RACE3("DIRSYNC %
9710: 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c  -3d (%s)\n", fd,
9720: 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66   zDirname);.  if
9730: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
9740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
9750: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d  OPEN; .  }.  r =
9760: 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c   fsync(fd);.  cl
9770: 6f 73 65 28 66 64 29 3b 0a 20 20 53 69 6d 75 6c  ose(fd);.  Simul
9780: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 3d 31 20  ateIOError( r=1 
9790: 29 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a 20 20  );.  if( r ){.  
97a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
97b0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b  IOERR_DIR_FSYNC;
97c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
97d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
97e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
97f0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
9800: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
9810: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
9820: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9830: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
9840: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
9850: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Byte){.  int rc;
9860: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
9870: 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74  .  rc = ftruncat
9880: 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  e(((unixFile*)id
9890: 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  )->h, (off_t)nBy
98a0: 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  te);.  SimulateI
98b0: 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
98c0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
98d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
98e0: 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20  ERR_TRUNCATE;.  
98f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
9900: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
9920: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
9930: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
9940: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
9950: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
9960: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
9970: 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
9980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
9990: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
99a0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
99b0: 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e   rc = fstat(((un
99c0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
99d0: 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
99e0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
99f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
9a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9a10: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
9a20: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
9a30: 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65  uf.st_size;.  re
9a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9a60: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9a70: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
9a80: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
9a90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
9aa0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
9ab0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
9ac0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
9ad0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
9ae0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
9af0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
9b00: 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c   unlocked or hol
9b10: 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c  ds only SHARED l
9b20: 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  ocks, then.** re
9b30: 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
9b40: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
9b50: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
9b60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
9b70: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  {.  int r = 0;. 
9b80: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
9b90: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
9ba0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
9bb0: 6c 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74  le );.  enterMut
9bc0: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
9bd0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
9be0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
9bf0: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
9c00: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
9c10: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
9c20: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
9c30: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
9c40: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
9c50: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
9c60: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
9c70: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
9c80: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
9c90: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
9ca0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s it..  */.  if(
9cb0: 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63   !r ){.    struc
9cc0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
9cd0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
9ce0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
9cf0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
9d00: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
9d10: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9d20: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
9d30: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
9d40: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
9d50: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
9d60: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c  ;.    if( lock.l
9d70: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
9d80: 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20  {.      r = 1;. 
9d90: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65     }.  }.  .  le
9da0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
9db0: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
9dc0: 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70  LOCK %d %d\n", p
9dd0: 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20  File->h, r);..  
9de0: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a  return r;.}../*.
9df0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
9e00: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
9e10: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
9e20: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
9e30: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
9e40: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
9e50: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
9e60: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
9e70: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
9e80: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
9e90: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
9ea0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
9eb0: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
9ec0: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
9ed0: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
9ee0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
9ef0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
9f00: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
9f10: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
9f20: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
9f30: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
9f40: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
9f50: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
9f60: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
9f70: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
9f80: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
9f90: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
9fa0: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
9fb0: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
9fc0: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
9fd0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
9fe0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
9ff0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
a000: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
a010: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
a020: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
a030: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
a040: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
a050: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
a060: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
a070: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a080: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
a090: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
a0a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a0b0: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
a0c0: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
a0d0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
a0e0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
a0f0: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
a100: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
a110: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
a120: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
a130: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
a140: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
a150: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
a160: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
a170: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
a180: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
a190: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
a1a0: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
a1b0: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
a1c0: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
a1d0: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
a1e0: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
a1f0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
a200: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
a210: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
a220: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
a230: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
a240: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
a250: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
a260: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
a270: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
a280: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
a290: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
a2a0: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
a2b0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
a2c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
a2d0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
a2e0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
a2f0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
a300: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
a310: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
a320: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
a330: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
a340: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
a350: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
a360: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
a370: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
a380: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
a390: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
a3a0: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
a3b0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
a3c0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
a3d0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
a3e0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
a3f0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
a400: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
a410: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
a420: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
a430: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
a440: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
a450: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a460: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
a470: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
a480: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
a490: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
a4a0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
a4b0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
a4c0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
a4d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
a4e0: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
a4f0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
a500: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
a510: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
a520: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
a530: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
a540: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
a550: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
a560: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
a570: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
a580: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
a590: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
a5a0: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
a5b0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
a5c0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
a5d0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
a5e0: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
a5f0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
a600: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
a610: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
a620: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
a630: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
a640: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
a650: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
a660: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
a670: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
a680: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
a690: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
a6a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
a6b0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
a6c0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
a6d0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
a6e0: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
a6f0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
a700: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
a710: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
a720: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
a730: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
a740: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
a750: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
a760: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
a770: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
a780: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
a790: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
a7a0: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
a7b0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
a7c0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
a7d0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
a7e0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
a7f0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
a800: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
a810: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
a820: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
a830: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
a840: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
a850: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
a860: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
a870: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
a880: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
a890: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
a8a0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a8b0: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
a8c0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
a8d0: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
a8e0: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
a8f0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
a900: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
a910: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
a920: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
a930: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
a940: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
a950: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
a960: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
a970: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
a980: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
a990: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
a9a0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
a9b0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72  xFile*)id;.  str
a9c0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
a9d0: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
a9e0: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
a9f0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73  ck lock;.  int s
aa00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
aa10: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37  le );.  OSTRACE7
aa20: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
aa30: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
aa40: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
aa50: 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70  h,.      locktyp
aa60: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
aa70: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
aa80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
aa90: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
aaa0: 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  me(pLock->lockty
aab0: 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  pe), pLock->cnt 
aac0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
aad0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
aae0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
aaf0: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
ab00: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
ab10: 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
ab20: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
ab30: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
ab40: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
ab50: 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d  , as.  ** enterM
ab60: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
ab70: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
ab80: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
ab90: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
aba0: 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
abb0: 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
abc0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
abd0: 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
abe0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  h,.            l
abf0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
ac00: 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75  type));.    retu
ac10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ac20: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
ac30: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
ac40: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
ac50: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
ac60: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ac70: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
ac80: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ac90: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
aca0: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
acb0: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
acc0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
acd0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
ace0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
acf0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
ad00: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
ad10: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
ad20: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
ad30: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
ad40: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65  threads.  */.  e
ad50: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
ad60: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
ad70: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
ad80: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
ad90: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
ada0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
adb0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
adc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
add0: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
ade0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
adf0: 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  }.  pLock = pFil
ae00: 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  e->pLock;..  /* 
ae10: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
ae20: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
ae30: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
ae40: 69 66 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a  ifferent OsFile*
ae50: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
ae60: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
ae70: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
ae80: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
ae90: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
aea0: 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d  locktype!=pLock-
aeb0: 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20  >locktype && .  
aec0: 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e          (pLock->
aed0: 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
aee0: 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  G_LOCK || lockty
aef0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  pe>SHARED_LOCK))
af00: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
af10: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
af20: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
af30: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
af40: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
af50: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
af60: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
af70: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
af80: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
af90: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
afa0: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
afb0: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
afc0: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
afd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
afe0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
aff0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
b000: 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d  & .      (pLock-
b010: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
b020: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
b030: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
b040: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
b050: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
b060: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
b070: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
b080: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30  ile->locktype==0
b090: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b0a0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a  pLock->cnt>0 );.
b0b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
b0c0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
b0d0: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  K;.    pLock->cn
b0e0: 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t++;.    pFile->
b0f0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
b100: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
b110: 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c  k;.  }..  lock.l
b120: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f  _len = 1L;..  lo
b130: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b140: 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20  EK_SET;..  /* A 
b150: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
b160: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
b170: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
b180: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
b190: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
b1a0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
b1b0: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
b1c0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
b1d0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
b1e0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
b1f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b200: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
b210: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
b220: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b230: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
b240: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
b250: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
b260: 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79  l_type = (lockty
b270: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  pe==SHARED_LOCK?
b280: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
b290: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b2a0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
b2b0: 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  E;.    s = fcntl
b2c0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b2d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
b2e0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
b2f0: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
b300: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
b310: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
b320: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f  E_BUSY;.      go
b330: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
b340: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
b350: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
b360: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
b370: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
b380: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
b390: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
b3a0: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
b3b0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
b3c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
b3d0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b3e0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
b3f0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
b400: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b410: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30  ock->locktype==0
b420: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
b430: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
b440: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
b450: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
b460: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
b470: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
b480: 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  ZE;.    s = fcnt
b490: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b4a0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20  TLK, &lock);..  
b4b0: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
b4c0: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
b4d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
b4e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
b4f0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
b500: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
b510: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b520: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
b530: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
b540: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
b550: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
b560: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
b570: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
b580: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
b590: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  pen */.      got
b5a0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
b5b0: 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31  }.    if( s==(-1
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
b5d0: 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20  (errno==EINVAL) 
b5e0: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
b5f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
b600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b610: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
b620: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
b630: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
b640: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
b650: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b   pLock->cnt = 1;
b660: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
b670: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
b680: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
b690: 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
b6a0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
b6b0: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
b6c0: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
b6d0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
b6e0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
b6f0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
b700: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
b710: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
b720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
b730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
b740: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
b750: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
b760: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
b770: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
b780: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
b790: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
b7a0: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
b7b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
b7c0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
b7d0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
b7e0: 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  0!=pFile->lockty
b7f0: 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  pe );.    lock.l
b800: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
b810: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63  .    switch( loc
b820: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  ktype ){.      c
b830: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
b840: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
b850: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
b860: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20  ED_BYTE;.       
b870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b880: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
b890: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
b8a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b8b0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
b8c0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
b8d0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
b8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
b8f0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
b900: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
b910: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
b920: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b930: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
b940: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
b950: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
b960: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
b970: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
b980: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
b990: 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
b9a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
b9b0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
b9c0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c  locktype;.    pL
b9d0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
b9e0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
b9f0: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
ba00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
ba10: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
ba20: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
ba30: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
ba40: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
ba50: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
ba60: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65  nd_lock:.  leave
ba70: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
ba80: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
ba90: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
baa0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
bab0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
bac0: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
bad0: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
bae0: 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
baf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
bb00: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
bb10: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
bb20: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
bb30: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
bb40: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
bb50: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
bb60: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
bb70: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
bb80: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
bb90: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bba0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
bbb0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
bbc0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
bbd0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
bbe0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
bbf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
bc00: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
bc10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
bc20: 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63  cktype){.  struc
bc30: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
bc40: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
bc50: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
bc60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bc70: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
bc80: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
bc90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
bca0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
bcb0: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
bcc0: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
bcd0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
bce0: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
bcf0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
bd00: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
bd10: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
bd20: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
bd30: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
bd40: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
bd50: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
bd60: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
bd70: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
bd80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
bda0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
bdb0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
bdc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
bdd0: 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75  E;.  }.  enterMu
bde0: 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d  tex();.  pLock =
bdf0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
be00: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
be10: 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  cnt!=0 );.  if( 
be20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
be30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
be40: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
be50: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c  ->locktype==pFil
be60: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
be70: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
be80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
be90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
bea0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
beb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bec0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bed0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
bee0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
bef0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bf00: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bf10: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
bf20: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bf30: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  K, &lock)==(-1) 
bf40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
bf50: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
bf60: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
bf70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bf80: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
bf90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
bfa0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
bfb0: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
bfc0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bfd0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
bfe0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
bff0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
c000: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
c010: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
c020: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
c030: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
c040: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c050: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
c060: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   ){.      pLock-
c070: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
c080: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
c090: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
c0a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c0b0: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
c0c0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c0d0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
c0e0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
c0f0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72  _LOCK ){.    str
c100: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
c110: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
c120: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
c130: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
c140: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
c150: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
c160: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
c170: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
c180: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
c190: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
c1a0: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
c1b0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
c1c0: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
c1d0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
c1e0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
c1f0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c200: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
c210: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c220: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
c230: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
c240: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
c250: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
c260: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
c270: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
c280: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
c290: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
c2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c2b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c2c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
c2d0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
c2e0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
c2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
c300: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
c310: 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
c320: 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
c330: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
c340: 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
c350: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
c360: 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
c370: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
c380: 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
c390: 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
c3a0: 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
c3b0: 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
c3c0: 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  */.    pOpen = p
c3d0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
c3e0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b   pOpen->nLock--;
c3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
c400: 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
c410: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e      if( pOpen->n
c420: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e  Lock==0 && pOpen
c430: 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a  ->nPending>0 ){.
c440: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
c460: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69  pen->nPending; i
c470: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  ++){.        clo
c480: 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  se(pOpen->aPendi
c490: 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ng[i]);.      }.
c4a0: 20 20 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e        free(pOpen
c4b0: 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20  ->aPending);.   
c4c0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
c4d0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  ng = 0;.      pO
c4e0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
c4f0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c  0;.    }.  }.  l
c500: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70  eaveMutex();.  p
c510: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
c520: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
c530: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c540: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
c550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c560: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
c570: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
c580: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c590: 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
c5a0: 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74  if( !pFile ) ret
c5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c5c0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
c5d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  NO_LOCK);.  if( 
c5e0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
c5f0: 29 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ) close(pFile->d
c600: 69 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  irfd);.  pFile->
c610: 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e  dirfd = -1;.  en
c620: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69  terMutex();..  i
c630: 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d  f( pFile->pOpen-
c640: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
c650: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
c660: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
c670: 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
c680: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
c690: 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
c6a0: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
c6b0: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
c6c0: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
c6d0: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
c6e0: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
c6f0: 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
c700: 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
c710: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
c720: 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  sed when.    ** 
c730: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
c740: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c750: 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a  .    int *aNew;.
c760: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
c770: 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c  nt *pOpen = pFil
c780: 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e  e->pOpen;.    aN
c790: 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 4f  ew = realloc( pO
c7a0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28  pen->aPending, (
c7b0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
c7c0: 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  1)*sizeof(int) )
c7d0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
c7e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
c7f0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c   a malloc fails,
c800: 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66   just leak the f
c810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
c820: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
c830: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
c840: 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ng = aNew;.     
c850: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
c860: 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  [pOpen->nPending
c870: 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  ] = pFile->h;.  
c880: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
c890: 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ing++;.    }.  }
c8a0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
c8b0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
c8c0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77  nding locks so w
c8d0: 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20  e can close the 
c8e0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
c8f0: 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 70 46   */.    close(pF
c900: 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72  ile->h);.  }.  r
c910: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
c920: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20  File->pLock);.  
c930: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
c940: 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20  File->pOpen);.. 
c950: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
c960: 20 70 46 69 6c 65 2d 3e 69 73 4f 70 65 6e 20 3d   pFile->isOpen =
c970: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
c980: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
c990: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70   pFile->h);.  Op
c9a0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
c9b0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
c9c0: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
c9d0: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
c9e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
c9f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ca00: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
ca10: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50  #pragma mark AFP
ca20: 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a   Support../*. **
ca30: 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
ca40: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
ca50: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
ca60: 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
ca70: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
ca80: 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
ca90: 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
caa0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
cab0: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
cac0: 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67  ontext {.  unsig
cad0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
cae0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20  aredLockByte;.  
caf0: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a  char *filePath;.
cb00: 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
cb10: 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
cb20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
cb30: 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
cb40: 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
cb50: 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
cb60: 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
cb70: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
cb80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
cb90: 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
cba0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
cbb0: 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
cbc0: 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
cbd0: 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
cbe0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
cbf0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cc00: 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
cc10: 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
cc20: 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
cc30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cc40: 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
cc50: 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
cc60: 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
cc70: 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
cc80: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
ccb0: 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
ccc0: 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
ccd0: 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
cce0: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
ccf0: 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
cd00: 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
cd10: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
cd20: 0a 0a 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e  ../* return 0 on
cd30: 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20 66   success, 1 on f
cd40: 61 69 6c 75 72 65 2e 20 20 54 6f 20 6d 61 74 63  ailure.  To matc
cd50: 68 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  h the behavior o
cd60: 66 20 74 68 65 20 0a 20 20 6e 6f 72 6d 61 6c 20  f the .  normal 
cd70: 70 6f 73 69 78 20 66 69 6c 65 20 6c 6f 63 6b 69  posix file locki
cd80: 6e 67 20 28 75 73 65 64 20 69 6e 20 75 6e 69 78  ng (used in unix
cd90: 4c 6f 63 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65  Lock for example
cda0: 29 2c 20 77 65 20 73 68 6f 75 6c 64 20 0a 20 20  ), we should .  
cdb0: 70 72 6f 76 69 64 65 20 27 72 69 63 68 65 72 27  provide 'richer'
cdc0: 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2d 20   return codes - 
cdd0: 73 70 65 63 69 66 69 63 61 6c 6c 79 20 74 6f 20  specifically to 
cde0: 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
cdf0: 74 77 65 65 6e 0a 20 20 27 66 69 6c 65 20 62 75  tween.  'file bu
ce00: 73 79 27 20 61 6e 64 20 27 66 69 6c 65 20 73 79  sy' and 'file sy
ce10: 73 74 65 6d 20 65 72 72 6f 72 27 20 72 65 73 75  stem error' resu
ce20: 6c 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lts */.static in
ce30: 74 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  t _AFPFSSetLock(
ce40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
ce50: 2c 20 69 6e 74 20 66 64 2c 20 75 6e 73 69 67 6e  , int fd, unsign
ce60: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
ce70: 73 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  set, .          
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
ce90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
cea0: 67 20 6c 65 6e 67 74 68 2c 20 69 6e 74 20 73 65  g length, int se
ceb0: 74 4c 6f 63 6b 46 6c 61 67 29 0a 7b 0a 20 20 73  tLockFlag).{.  s
cec0: 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
ced0: 6f 63 6b 50 42 32 20 20 20 20 20 20 20 70 62 3b  ockPB2       pb;
cee0: 0a 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 20  .  int          
cef0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a             err;.
cf00: 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
cf10: 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
cf20: 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
cf30: 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
cf40: 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
cf50: 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
cf60: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
cf70: 70 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53  pb.fd = fd;.  OS
cf80: 54 52 41 43 45 35 28 22 41 46 50 4c 4f 43 4b 20  TRACE5("AFPLOCK 
cf90: 73 65 74 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20  setting lock %s 
cfa0: 66 6f 72 20 25 64 20 69 6e 20 72 61 6e 67 65 20  for %d in range 
cfb0: 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
cfc0: 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
cfd0: 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c  "ON":"OFF"), fd,
cfe0: 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
cff0: 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
d000: 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
d010: 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
d020: 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
d030: 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
d040: 4f 53 54 52 41 43 45 34 28 22 41 46 50 4c 4f 43  OSTRACE4("AFPLOC
d050: 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
d060: 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
d070: 22 2c 20 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20  ", path, errno, 
d080: 0a 20 20 20 20 20 20 73 74 72 65 72 72 6f 72 28  .      strerror(
d090: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74  errno));.    ret
d0a0: 75 72 6e 20 31 3b 20 2f 2a 20 65 72 72 6f 72 20  urn 1; /* error 
d0b0: 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  */.  } else {.  
d0c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d0d0: 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 72  }../*. ** This r
d0e0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
d0f0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
d100: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
d110: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
d120: 20 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73   ** file by this
d130: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
d140: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
d150: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
d160: 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65  eturn. ** non-ze
d170: 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ro.  If the file
d180: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20   is unlocked or 
d190: 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45  holds only SHARE
d1a0: 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 20 2a  D locks, then. *
d1b0: 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20  * return zero.. 
d1c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
d1d0: 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  pUnixCheckReserv
d1e0: 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  edLock(OsFile *i
d1f0: 64 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  d){.  int r = 0;
d200: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d210: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d220: 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
d230: 20 70 46 69 6c 65 20 29 3b 20 0a 20 20 61 66 70   pFile ); .  afp
d240: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
d250: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
d260: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
d270: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d280: 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 43  ntext;.  .  /* C
d290: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
d2a0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
d2b0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
d2c0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
d2d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
d2e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
d2f0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
d300: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
d310: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
d320: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
d330: 20 20 20 2a 2f 0a 20 20 69 66 20 28 20 21 72 20     */.  if ( !r 
d340: 29 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20  ) {.    /* lock 
d350: 74 68 65 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  the byte */.    
d360: 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46  int failed = _AF
d370: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
d380: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
d390: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
d3a0: 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
d3b0: 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
d3c0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
d3d0: 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
d3e0: 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
d3f0: 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
d400: 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
d410: 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65   = 1;.    } else
d420: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
d430: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
d440: 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
d450: 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
d460: 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
d470: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
d480: 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
d490: 20 20 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b     _AFPFSSetLock
d4a0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
d4b0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45  th, pFile->h, RE
d4c0: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
d4d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
d4e0: 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20 57  OSTRACE3("TEST W
d4f0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c  R-LOCK %d %d\n",
d500: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 20   pFile->h, r);. 
d510: 20 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a   .  return r;.}.
d520: 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c 6f  ./* AFP-style lo
d530: 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
d540: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
d550: 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74 68  unixLock, see th
d560: 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20 66  e unixLock .** f
d570: 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  unction comments
d580: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66 20   for details of 
d590: 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74 2e  lock management.
d5a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
d5b0: 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c  fpUnixLock(OsFil
d5c0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
d5d0: 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20 72 63 20  ype).{.  int rc 
d5e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
d5f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d600: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d610: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
d620: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
d630: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d640: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
d650: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
d660: 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
d670: 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
d680: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
d690: 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20  TRACE5("LOCK    
d6a0: 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69 64  %d %s was %s pid
d6b0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
d6c0: 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74  ,.         lockt
d6d0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
d6e0: 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  ), locktypeName(
d6f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
d700: 2c 20 67 65 74 70 69 64 28 29 29 3b 20 20 0a 20  , getpid());  . 
d710: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
d720: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
d730: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
d740: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
d750: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 73  on the.    ** Os
d760: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
d770: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
d780: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
d790: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 20 20  it path, as.    
d7a0: 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20  ** enterMutex() 
d7b0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
d7c0: 65 64 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a 20  ed yet..    */. 
d7d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
d7e0: 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
d7f0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  {.    OSTRACE3("
d800: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
d810: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
d820: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
d830: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
d840: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
d850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d860: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
d870: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
d880: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
d890: 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 20 20   is correct.    
d8a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d8b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
d8c0: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
d8d0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
d8e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
d8f0: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
d900: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
d910: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
d920: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
d930: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
d940: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
d950: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
d960: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
d970: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
d980: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
d990: 72 65 61 64 73 0a 20 20 20 20 2a 2f 0a 20 20 65  reads.    */.  e
d9a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
d9b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
d9c0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
d9d0: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
d9e0: 20 20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72      */.  rc = tr
d9f0: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
da00: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
da10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
da20: 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
da30: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
da40: 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
da50: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
da60: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
da70: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
da80: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
da90: 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  .    ** acquirin
daa0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
dab0: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
dac0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
dad0: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20  ENDING will.    
dae0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
daf0: 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63      */.  if( loc
db00: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
db10: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f  CK .      || (lo
db20: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
db30: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
db40: 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e  >locktype<PENDIN
db50: 47 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b  G_LOCK).      ){
db60: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
db70: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
db80: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
db90: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20  h, pFile->h, .  
dba0: 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
dbb0: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
dbc0: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
dbd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
dbe0: 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  Y;.      goto af
dbf0: 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
dc00: 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
dc10: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
dc20: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
dc30: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
dc40: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20  ead and make.   
dc50: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
dc60: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
dc70: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
dc80: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20  k..    */.  if( 
dc90: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
dca0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
dcb0: 20 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20   lk, failed;.   
dcc0: 20 69 6e 74 20 74 72 69 65 73 20 3d 20 30 3b 0a   int tries = 0;.
dcd0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20      .    /* Now 
dce0: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
dcf0: 6b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  k */.    /* note
dd00: 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
dd10: 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
dd20: 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
dd30: 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
dd40: 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
dd50: 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  ); .    context-
dd60: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
dd70: 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  = (lk & 0x7fffff
dd80: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
dd90: 20 2d 20 31 29 3b 0a 20 20 20 20 66 61 69 6c 65   - 1);.    faile
dda0: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
ddb0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
ddc0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a  ath, pFile->h, .
ddd0: 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
dde0: 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72  ST+context->shar
ddf0: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
de00: 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 44  );.    .    /* D
de10: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
de20: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
de30: 2f 0a 20 20 20 20 69 66 20 28 5f 41 46 50 46 53  /.    if (_AFPFS
de40: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
de50: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
de60: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
de70: 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  E, 1, 0)) {.    
de80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
de90: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20  ERR_UNLOCK;  /* 
dea0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
deb0: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
dec0: 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
ded0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  ock;.    }.    .
dee0: 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
def0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
df00: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
df10: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
df20: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
df30: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
df40: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
df50: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
df60: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
df70: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
df80: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
df90: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
dfa0: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
dfb0: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
dfc0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
dfd0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
dfe0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
dff0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
e000: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
e010: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66  cktype );.    if
e020: 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45   (locktype >= RE
e030: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
e040: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c  File->locktype <
e050: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
e060: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
e070: 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
e080: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
e090: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
e0a0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
e0b0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
e0c0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
e0d0: 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20  E, 1,1);.    }. 
e0e0: 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
e0f0: 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58  & locktype == EX
e100: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
e110: 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
e120: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
e130: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
e140: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
e150: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
e160: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
e170: 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
e180: 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
e190: 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
e1a0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
e1b0: 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
e1c0: 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a    afpUnixUnlock.
e1d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e1e0: 66 20 28 21 5f 41 46 50 46 53 53 65 74 4c 6f 63  f (!_AFPFSSetLoc
e1f0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
e200: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53  ath, pFile->h, S
e210: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
e240: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
e250: 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 0)) {.       
e260: 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
e270: 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
e280: 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
e290: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
e2a0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
e2b0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e2c0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e2d0: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
e300: 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
e310: 20 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 65         if (faile
e320: 64 20 26 26 20 5f 41 46 50 46 53 53 65 74 4c 6f  d && _AFPFSSetLo
e330: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e340: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e350: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72     context->shar
e390: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
e3a0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  )) {.          r
e3b0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e3c0: 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73  _RDLOCK; /* this
e3d0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
e3e0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ppen */.        
e3f0: 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
e400: 0a 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20  .        /* */. 
e410: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e420: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
e430: 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20   /* this should 
e440: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
e450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e460: 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
e470: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  rc == SQLITE_OK)
e480: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e490: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
e4a0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
e4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e4c0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
e4d0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
e4e0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
e4f0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
e500: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
e510: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
e520: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
e530: 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
e540: 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
e550: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
e560: 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22  K    %d %s %s\n"
e570: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
e580: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
e590: 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  e), .         rc
e5a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
e5b0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
e5c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e5d0: 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
e5e0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e5f0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e600: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
e610: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20  ype.  locktype. 
e620: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
e630: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
e640: 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
e650: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
e660: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
e670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
e680: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
e690: 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
e6a0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
e6b0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
e6c0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
e6d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
e6e0: 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69  pUnixUnlock(OsFi
e6f0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
e700: 74 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63 74  type) {.  struct
e710: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
e720: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e730: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
e740: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
e750: 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
e760: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
e770: 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
e780: 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
e790: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
e7a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e7b0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
e7c0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e7d0: 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22  was %d pid=%d\n"
e7e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
e7f0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70  type,.         p
e800: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
e810: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20 20  getpid());.  .  
e820: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
e830: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
e840: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
e850: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
e860: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e870: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e880: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
e890: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
e8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
e8b0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74  ISUSE;.  }.  ent
e8c0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
e8d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e8e0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
e8f0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
e900: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
e910: 0a 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65  .      int faile
e920: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  d = 0;..      /*
e930: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c   unlock the excl
e940: 75 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74 68  usive range - th
e950: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  en re-establish 
e960: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e970: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  */.      if (pFi
e980: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  le->locktype==EX
e990: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
e9a0: 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
e9b0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e9c0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e9d0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e9e0: 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
ea10: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
ea20: 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64       if (!failed
ea30: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ) {.          /*
ea40: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
ea50: 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75 73  moved the exclus
ea60: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ive lock */.    
ea70: 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53        if (_AFPFS
ea80: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
ea90: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
eaa0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
eab0: 54 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T+.             
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
ead0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
eae0: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b  ckByte, 1, 1)) {
eaf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
eb00: 66 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74  failed to re-est
eb10: 61 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65  ablish our share
eb20: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
eb30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
eb40: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20  E_IOERR_RDLOCK; 
eb50: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
eb60: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
eb70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
eb80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
eb90: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
eba0: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
ebb0: 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75 6e  n - failed to un
ebc0: 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69  lock the exclusi
ebd0: 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ve range */.    
ebe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ebf0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ec00: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
ec10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
ec20: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
ec30: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
ec40: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
ec50: 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f  K) {.      if (_
ec60: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
ec70: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
ec80: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
ec90: 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b 0a  G_BYTE, 1, 0)){.
eca0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
ecb0: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
ecc0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f   pending lock */
ecd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ece0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ecf0: 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  K; /* This shoul
ed00: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
ed10: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  /.      }.    } 
ed20: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
ed30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
ed40: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
ed50: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
ed60: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
ed70: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
ed80: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
ed90: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
eda0: 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20  , 1, 0)) {.     
edb0: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
edc0: 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73 65  release the rese
edd0: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  rved lock */.   
ede0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
edf0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
ee00: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
ee10: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
ee20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20       }.    } .  
ee30: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
ee40: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
ee50: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
ee60: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
ee70: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
ee80: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
eeb0: 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d  FIRST + context-
eec0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
eed0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28   1, 0);.    if (
eee0: 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
eef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ef00: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
ef10: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
ef20: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a  happen */.    }.
ef30: 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d 20    }.  if (rc == 
ef40: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 70  SQLITE_OK).    p
ef50: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
ef60: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 6c 65 61   locktype;.  lea
ef70: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
ef80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  urn rc;.}../*. *
ef90: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
efa0: 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
efb0: 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
efc0: 6e 74 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69  ntext . */.stati
efd0: 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f  c int afpUnixClo
efe0: 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
eff0: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69   {.  unixFile *i
f000: 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
f010: 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69  pId;.  .  if( !i
f020: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
f030: 45 5f 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55  E_OK;.  afpUnixU
f040: 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c  nlock(*pId, NO_L
f050: 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20  OCK);.  /* free 
f060: 74 68 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20  the AFP locking 
f070: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
f080: 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  f (id->lockingCo
f090: 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntext != NULL) {
f0a0: 0a 20 20 20 20 69 66 20 28 28 28 61 66 70 4c 6f  .    if (((afpLo
f0b0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69  ckingContext *)i
f0c0: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f0d0: 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20  t)->filePath != 
f0e0: 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69  NULL).      sqli
f0f0: 74 65 33 5f 66 72 65 65 28 28 28 61 66 70 4c 6f  te3_free(((afpLo
f100: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 69 64  ckingContext*)id
f110: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
f120: 29 2d 3e 66 69 6c 65 50 61 74 68 29 3b 0a 20 20  )->filePath);.  
f130: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69    sqlite3_free(i
f140: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f150: 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  t);.  }.  .  if(
f160: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
f170: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
f180: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
f190: 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  -1;.  close(id->
f1a0: 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  h);.  id->isOpen
f1b0: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
f1c0: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
f1d0: 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
f1e0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
f1f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 29  sqlite3_free(id)
f200: 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
f210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f220: 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61  ;.}...#pragma ma
f230: 72 6b 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65  rk flock() style
f240: 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a   locking../*. **
f250: 20 54 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e   The flockLockin
f260: 67 43 6f 6e 74 65 78 74 20 69 73 20 6e 6f 74 20  gContext is not 
f270: 75 73 65 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66  used. */.typedef
f280: 20 76 6f 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69   void flockLocki
f290: 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74  ngContext;..stat
f2a0: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78  ic int flockUnix
f2b0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f2c0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a  k(OsFile *id) {.
f2d0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f2e0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f2f0: 64 3b 0a 20 20 0a 20 20 69 66 20 28 70 46 69 6c  d;.  .  if (pFil
f300: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 52  e->locktype == R
f310: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
f320: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a      return 1; /*
f330: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
f340: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
f350: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
f360: 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
f370: 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
f380: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
f390: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
f3a0: 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
f3b0: 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20     if (!rc) {.  
f3c0: 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
f3d0: 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
f3e0: 2f 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70 46  /.      flock(pF
f3f0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
f400: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
f410: 3b 20 20 2f 2a 20 6e 6f 20 6f 6e 65 20 68 61 73  ;  /* no one has
f420: 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
f430: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f440: 20 31 3b 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65   1; /* someone e
f450: 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
f460: 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
f470: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
f480: 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73  flockUnixLock(Os
f490: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
f4a0: 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
f4b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f4c0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
f4d0: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
f4e0: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
f4f0: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
f500: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
f510: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
f520: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
f530: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
f540: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f  ->locktype > NO_
f550: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
f560: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
f570: 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
f580: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f590: 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
f5a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f5b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66   */.  int rc = f
f5c0: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
f5d0: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
f5e0: 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20  );.  if (rc) {. 
f5f0: 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
f600: 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
f610: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f620: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65 6c  ITE_BUSY;.  } el
f630: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
f640: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
f650: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
f660: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
f670: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
f680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f690: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73  ITE_OK;.  }.}..s
f6a0: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
f6b0: 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  nixUnlock(OsFile
f6c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
f6d0: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
f6e0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f6f0: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
f700: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
f710: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
f720: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
f730: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
f740: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
f750: 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
f760: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f770: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
f780: 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
f790: 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
f7a0: 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
f7b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
f7c0: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
f7d0: 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
f7e0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f7f0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
f800: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f810: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
f820: 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
f830: 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ck. */.  int rc 
f840: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
f850: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66  , LOCK_UN);.  if
f860: 20 28 72 63 29 0a 20 20 20 20 72 65 74 75 72 6e   (rc).    return
f870: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f880: 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20  LOCK;.  else {. 
f890: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
f8a0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
f8b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f8c0: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  OK;.  }.}../*. *
f8d0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
f8e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
f8f0: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73  lockUnixClose(Os
f900: 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20  File **pId) {.  
f910: 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28  unixFile *id = (
f920: 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
f930: 20 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72    .  if( !id ) r
f940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f950: 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f  .  flockUnixUnlo
f960: 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b  ck(*pId, NO_LOCK
f970: 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e  );.  .  if( id->
f980: 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
f990: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69  (id->dirfd);.  i
f9a0: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
f9b0: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
f9c0: 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29   .  close(id->h)
f9d0: 3b 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  ;  .  leaveMutex
f9e0: 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
f9f0: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
fa00: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
fa10: 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
fa20: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
fa30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 29  sqlite3_free(id)
fa40: 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
fa50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fa60: 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  ;.}..#pragma mar
fa70: 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f  k Old-School .lo
fa80: 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f  ck file based lo
fa90: 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  cking../*. ** Th
faa0: 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
fab0: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
fac0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64  e contains all d
fad0: 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c  otlock (.lock) l
fae0: 6f 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63  ock. ** specific
faf0: 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64   state. */.typed
fb00: 65 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63  ef struct dotloc
fb10: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
fb20: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
fb30: 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f  ntext;.struct do
fb40: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
fb50: 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f  ext {.  char *lo
fb60: 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61  ckPath;.};...sta
fb70: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
fb80: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
fb90: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
fba0: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
fbb0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fbc0: 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c  *)id;.  dotlockL
fbd0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
fbe0: 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64  ontext = .    (d
fbf0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
fc00: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
fc10: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
fc20: 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c   .  if (pFile->l
fc30: 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52  ocktype == RESER
fc40: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
fc50: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72  return 1; /* alr
fc60: 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65  eady have a rese
fc70: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  rved lock */.  }
fc80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75   else {.    stru
fc90: 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
fca0: 0a 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63  .    if (lstat(c
fcb0: 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
fcc0: 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29  ,&statBuf) == 0)
fcd0: 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65  .      /* file e
fce0: 78 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65  xists, someone e
fcf0: 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
fd00: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
fd10: 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20   1;.    else.   
fd20: 20 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20     /* file does 
fd30: 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f  not exist, we co
fd40: 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
fd50: 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
fd60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
fd70: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
fd80: 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f  otlockUnixLock(O
fd90: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
fda0: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
fdb0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fdc0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
fdd0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
fde0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
fdf0: 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f   .    (dotlockLo
fe00: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
fe10: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
fe20: 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 69  ntext;.  .  /* i
fe30: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
fe40: 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
fe50: 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
fe60: 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
fe70: 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
fe80: 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
fe90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
fea0: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
feb0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
fec0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
fed0: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c  ;.    .    /* Al
fee0: 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
fef0: 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
ff00: 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
ff10: 20 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d   utimes(context-
ff20: 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b  >lockPath,NULL);
ff30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ff40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
ff50: 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  /* check to see 
ff60: 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  if lock file alr
ff70: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
ff80: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
ff90: 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
ffa0: 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  t(context->lockP
ffb0: 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d  ath,&statBuf) ==
ffc0: 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   0){.    return 
ffd0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a 20  SQLITE_BUSY; /* 
ffe0: 69 74 20 64 6f 65 73 2c 20 62 75 73 79 20 2a 2f  it does, busy */
fff0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
10000 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
10010 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20  ock */.  int fd 
10020 3d 20 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e  = open(context->
10030 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c  lockPath,O_RDONL
10040 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  Y|O_CREAT|O_EXCL
10050 2c 30 36 30 30 29 3b 0a 20 20 69 66 20 28 66 64  ,0600);.  if (fd
10060 20 3c 20 30 29 20 7b 0a 20 20 20 20 2f 2a 20 66   < 0) {.    /* f
10070 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
10080 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73  eate the file, s
10090 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20  omeone else may 
100a0 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20  have stolen the 
100b0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74 75  lock */.    retu
100c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20  rn SQLITE_BUSY; 
100d0 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29  .  }.  close(fd)
100e0 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74  ;.  .  /* got it
100f0 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
10100 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
10110 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10120 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10140 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
10150 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63  dotlockUnixUnloc
10160 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
10170 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
10180 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10190 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
101a0 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  .  dotlockLockin
101b0 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
101c0 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63  t = .    (dotloc
101d0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
101e0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
101f0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
10200 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
10210 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10220 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
10230 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
10240 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
10250 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
10260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10270 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10280 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
10290 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
102a0 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
102b0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
102c0 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
102d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
102e0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
102f0 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10310 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
10320 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
10330 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  ock. */.  unlink
10340 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
10350 74 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  th);.  pFile->lo
10360 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
10370 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10380 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
10390 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
103a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
103b0 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73  lockUnixClose(Os
103c0 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20  File **pId) {.  
103d0 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28  unixFile *id = (
103e0 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
103f0 20 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72    .  if( !id ) r
10400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10410 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e  .  dotlockUnixUn
10420 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f  lock(*pId, NO_LO
10430 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74  CK);.  /* free t
10440 68 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69  he dotlock locki
10450 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
10460 20 20 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e    if (id->lockin
10470 67 43 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c  gContext != NULL
10480 29 20 7b 0a 20 20 20 20 69 66 20 28 28 28 64 6f  ) {.    if (((do
10490 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
104a0 65 78 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e  ext *)id->lockin
104b0 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
104c0 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  ath != NULL).   
104d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
104e0 20 28 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69   ( (dotlockLocki
104f0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 0a 20 20 20  ngContext *).   
10500 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 69 6e 67       id->locking
10510 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
10520 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
10530 5f 66 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e  _free(id->lockin
10540 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
10550 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66   .  if( id->dirf
10560 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d  d>=0 ) close(id-
10570 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64  >dirfd);.  id->d
10580 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
10590 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
105a0 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20  close(id->h);.  
105b0 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
105c0 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
105d0 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  0;.  OSTRACE2("C
105e0 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
105f0 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
10600 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
10610 69 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a 20  ite3_free(id);. 
10620 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74   *pId = 0;.  ret
10630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10640 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  ...#pragma mark 
10650 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20  No locking../*. 
10660 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63  ** The nolockLoc
10670 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73 20 76  kingContext is v
10680 6f 69 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  oid. */.typedef 
10690 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69  void nolockLocki
106a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74  ngContext;..stat
106b0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
106c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
106d0 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b  ck(OsFile *id) {
106e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
106f0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10700 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65  kUnixLock(OsFile
10710 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10720 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53  pe) {.  return S
10730 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
10740 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10750 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20  ixUnlock(OsFile 
10760 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
10770 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  e) {.  return SQ
10780 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
10790 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
107a0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
107b0 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28  nolockUnixClose(
107c0 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a  OsFile **pId) {.
107d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d    unixFile *id =
107e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64   (unixFile*)*pId
107f0 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20 29  ;.  .  if( !id )
10800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10810 4b 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72  K;.  if( id->dir
10820 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64  fd>=0 ) close(id
10830 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e  ->dirfd);.  id->
10840 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e  dirfd = -1;.  en
10850 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20  terMutex();.  . 
10860 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
10870 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
10880 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
10890 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
108a0 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
108b0 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
108c0 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
108d0 6c 69 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a  lite3_free(id);.
108e0 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65    *pId = 0;.  re
108f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10900 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
10910 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10920 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
10930 20 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20   0./*.** Change 
10940 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10950 20 66 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20 69   fullsync flag i
10960 6e 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  n the given file
10970 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a   descriptor..*/.
10980 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
10990 53 65 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69  SetFullSync(OsFi
109a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 76 29 7b 0a  le *id, int v){.
109b0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
109c0 29 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 76 3b  )->fullSync = v;
109d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
109e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
109f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
10a00 61 6e 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61  an OsFile.*/.sta
10a10 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
10a20 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69  Handle(OsFile *i
10a30 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  d){.  return ((u
10a40 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b  nixFile*)id)->h;
10a50 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
10a60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
10a70 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
10a80 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
10a90 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
10aa0 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
10ab0 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
10ac0 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
10ad0 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
10ae0 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
10af0 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
10b00 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
10b10 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
10b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
10b30 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
10b40 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
10b50 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
10b60 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
10b70 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
10b80 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
10b90 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
10ba0 61 6e 64 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c  and it's journal
10bb0 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
10bc0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
10bd0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
10be0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
10bf0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
10c00 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
10c10 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
10c20 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
10c30 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
10c40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10c50 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
10c60 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
10c70 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
10c80 61 6c 77 61 79 73 20 30 2e 0a 2a 2f 0a 73 74 61  always 0..*/.sta
10c90 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
10ca0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
10cb0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
10cc0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  id){.  return 0;
10cd0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
10ce0 6e 69 78 42 72 65 61 6b 4c 6f 63 6b 28 73 71 6c  nixBreakLock(sql
10cf0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
10d00 20 20 61 73 73 65 72 74 28 21 22 54 4f 44 4f 3a    assert(!"TODO:
10d10 20 75 6e 69 78 42 72 65 61 6b 4c 6f 63 6b 28 29   unixBreakLock()
10d20 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ");.  return 0;.
10d30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10d40 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
10d50 69 6e 64 69 63 65 73 20 74 68 65 20 74 79 70 65  indices the type
10d60 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74   of lock current
10d70 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68  ly held.** by th
10d80 69 73 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65  is handle.  (Use
10d90 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
10da0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
10db0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
10dc0 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 28 73 71  unixLockState(sq
10dd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
10de0 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78  .  return ((unix
10df0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
10e00 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype;.}../*.** Th
10e10 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
10e20 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
10e30 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
10e40 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
10e50 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  ** for unix..*/.
10e60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
10e70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
10e80 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74  sqlite3UnixIoMet
10e90 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  hod = {.  1,    
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
10ec0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a  */.  unixClose,.
10ed0 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
10ee0 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54  ixWrite,.  unixT
10ef0 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
10f00 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53  ync,.  unixFileS
10f10 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  ize,.  unixLock,
10f20 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20  .  unixUnlock,. 
10f30 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
10f40 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 42 72  edLock,.  unixBr
10f50 65 61 6b 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c  eakLock,.  unixL
10f60 6f 63 6b 53 74 61 74 65 2c 0a 20 20 75 6e 69 78  ockState,.  unix
10f70 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
10f80 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
10f90 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 23 69 66 64  ristics.};..#ifd
10fa0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10fb0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
10fc0 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  *. ** This vecto
10fd0 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
10fe0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
10ff0 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
11000 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20   OsFile. ** for 
11010 75 6e 69 78 20 77 69 74 68 20 41 46 50 20 73 74  unix with AFP st
11020 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
11030 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  .. */.static con
11040 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69  st IoMethod sqli
11050 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69  te3AFPLockingUni
11060 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
11070 20 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c 0a    afpUnixClose,.
11080 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65      unixOpenDire
11090 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52  ctory,.    unixR
110a0 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69  ead,.    unixWri
110b0 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b  te,.    unixSeek
110c0 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61  ,.    unixTrunca
110d0 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63  te,.    unixSync
110e0 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c  ,.    unixSetFul
110f0 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46  lSync,.    unixF
11100 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75  ileHandle,.    u
11110 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20  nixFileSize,.   
11120 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20   afpUnixLock,.  
11130 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c    afpUnixUnlock,
11140 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  .    unixLockSta
11150 74 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 43  te,.    afpUnixC
11160 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11170 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72  ,.    unixSector
11180 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a  Size,.};../*. **
11190 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
111a0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
111b0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
111c0 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
111d0 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20  le. ** for unix 
111e0 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79  with flock() sty
111f0 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  le file locking.
11200 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
11210 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74  t IoMethod sqlit
11220 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  e3FlockLockingUn
11230 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11240 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73     flockUnixClos
11250 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44  e,.    unixOpenD
11260 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e  irectory,.    un
11270 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78  ixRead,.    unix
11280 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  Write,.    unixS
11290 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75  eek,.    unixTru
112a0 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  ncate,.    unixS
112b0 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74  ync,.    unixSet
112c0 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e  FullSync,.    un
112d0 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20  ixFileHandle,.  
112e0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
112f0 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63      flockUnixLoc
11300 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78  k,.    flockUnix
11310 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78  Unlock,.    unix
11320 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 66  LockState,.    f
11330 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
11340 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20 75  ervedLock,.    u
11350 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d  nixSectorSize,.}
11360 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76  ;../*. ** This v
11370 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
11380 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
11390 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
113a0 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20  n an OsFile. ** 
113b0 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f  for unix with do
113c0 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65  tlock style file
113d0 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74   locking.. */.st
113e0 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74  atic const IoMet
113f0 68 6f 64 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f  hod sqlite3Dotlo
11400 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
11410 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64 6f  ethod = {.    do
11420 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a  tlockUnixClose,.
11430 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65      unixOpenDire
11440 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52  ctory,.    unixR
11450 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69  ead,.    unixWri
11460 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b  te,.    unixSeek
11470 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61  ,.    unixTrunca
11480 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63  te,.    unixSync
11490 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c  ,.    unixSetFul
114a0 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46  lSync,.    unixF
114b0 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75  ileHandle,.    u
114c0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20  nixFileSize,.   
114d0 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b   dotlockUnixLock
114e0 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ,.    dotlockUni
114f0 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69  xUnlock,.    uni
11500 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20  xLockState,.    
11510 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b  dotlockUnixCheck
11520 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
11530 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
11540 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69  ,.};../*. ** Thi
11550 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
11560 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
11570 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
11580 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20  e on an OsFile. 
11590 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68  ** for unix with
115a0 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66   dotlock style f
115b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f  ile locking.. */
115c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
115d0 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 4e 6f  Method sqlite3No
115e0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
115f0 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 6e 6f  oMethod = {.  no
11600 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20  lockUnixClose,. 
11610 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
11620 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
11630 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
11640 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
11650 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
11660 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
11670 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
11680 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
11690 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f  FileSize,.  nolo
116a0 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f  ckUnixLock,.  no
116b0 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
116c0 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
116d0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  .  nolockUnixChe
116e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
116f0 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
11700 2c 0a 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ,.};..#endif /* 
11710 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11720 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
11730 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
11740 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
11750 75 6e 69 78 46 69 6c 65 20 61 6e 64 20 69 6e 69  unixFile and ini
11760 74 69 61 6c 69 7a 65 20 74 68 61 74 20 75 6e 69  tialize that uni
11770 78 46 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65 20  xFile..** Write 
11780 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11790 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 69 6e   new unixFile in
117a0 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20 77  to *pId..** If w
117b0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
117c0 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  ory, close the f
117d0 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ile and return a
117e0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64  n error..*/.#ifd
117f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11800 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
11810 2a 20 0a 20 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b  * . ** When lock
11820 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 73 20 61  ing extensions a
11830 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20  re enabled, the 
11840 66 69 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f 63  filepath and loc
11850 6b 69 6e 67 20 73 74 79 6c 65 20 0a 20 2a 2a 20  king style . ** 
11860 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20 64 65  are needed to de
11870 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
11880 46 69 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f 20  File pMethod to 
11890 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  use for locking 
118a0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 20 2a 2a 20  operations.. ** 
118b0 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  The locking-styl
118c0 65 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  e specific locki
118d0 6e 67 43 6f 6e 74 65 78 74 20 64 61 74 61 20 73  ngContext data s
118e0 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
118f0 74 65 64 20 0a 20 2a 2a 20 61 6e 64 20 61 73 73  ted . ** and ass
11900 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73 6f 2e  igned here also.
11910 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
11920 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
11930 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  (.  int h,      
11940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11950 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
11960 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
11970 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 4f 73  g opened */.  Os
11980 46 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20  File **pId,     
11990 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
119a0 6f 6d 70 6c 65 74 65 64 20 69 6e 69 74 69 61 6c  ompleted initial
119b0 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a  ization here */.
119c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
119d0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
119e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
119f0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
11a00 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20  int delFlag     
11a10 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
11a20 65 2d 6f 6e 2d 6f 72 2d 62 65 66 6f 72 65 2d 63  e-on-or-before-c
11a30 6c 6f 73 65 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  lose flag */.){.
11a40 20 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67    sqlite3Locking
11a50 53 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79  Style lockingSty
11a60 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
11a70 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65  pNew;.  unixFile
11a80 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   f;.  int rc;.. 
11a90 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
11aa0 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 6c 6f 63  izeof(f));.  loc
11ab0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c 69  kingStyle = sqli
11ac0 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67  te3DetectLocking
11ad0 53 74 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  Style(zFilename,
11ae0 20 68 29 3b 0a 20 20 69 66 20 28 20 6c 6f 63 6b   h);.  if ( lock
11af0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 70 6f 73 69  ingStyle == posi
11b00 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29 20  xLockingStyle ) 
11b10 7b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78  {.    enterMutex
11b20 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
11b30 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66 2e  dLockInfo(h, &f.
11b40 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
11b50 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78  ;.    leaveMutex
11b60 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ();.    if( rc )
11b70 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29  {.      close(h)
11b80 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  ;.      unlink(z
11b90 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
11ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11bb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  OMEM;.    }.  } 
11bc0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 20 70  else {.    /*  p
11bd0 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61  Lock and pOpen a
11be0 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
11bf0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
11c00 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 66  locking */.    f
11c10 2e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  .pLock = NULL;. 
11c20 20 20 20 66 2e 70 4f 70 65 6e 20 3d 20 4e 55 4c     f.pOpen = NUL
11c30 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 65 6c  L;.  }.  if( del
11c40 46 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e 6c 69  Flag ){.    unli
11c50 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
11c60 20 7d 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d   }.  f.dirfd = -
11c70 31 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20  1;.  f.h = h;.  
11c80 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29  SET_THREADID(&f)
11c90 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
11ca0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
11cb0 66 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20  f(unixFile) );. 
11cc0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
11cd0 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
11ce0 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
11cf0 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
11d00 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20  nfo(f.pLock);.  
11d10 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74    releaseOpenCnt
11d20 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 6c  (f.pOpen);.    l
11d30 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
11d40 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72   *pId = 0;.    r
11d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11d60 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
11d70 20 2a 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20   *pNew = f;.    
11d80 73 77 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74  switch(lockingSt
11d90 79 6c 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73  yle) {.      cas
11da0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  e afpLockingStyl
11db0 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e: {.        /* 
11dc0 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  afp locking uses
11dd0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
11de0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
11df0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
11e00 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c       ** the afpL
11e10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f  ockingContext */
11e20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69  .        int nFi
11e30 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
11e40 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
11e50 26 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69  &sqlite3AFPLocki
11e60 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  ngUnixIoMethod;.
11e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f          pNew->lo
11e80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a  ckingContext = .
11e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11ea0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
11eb0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
11ec0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69  t));.        nFi
11ed0 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  lename = strlen(
11ee0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
11ef0 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69        ((afpLocki
11f00 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77  ngContext *)pNew
11f10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11f20 29 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20  )->filePath = . 
11f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f40 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
11f50 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  e);.        memc
11f60 70 79 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  py(((afpLockingC
11f70 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c  ontext *)pNew->l
11f80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
11f90 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20  filePath, .     
11fa0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
11fb0 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
11fc0 0a 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  .        srandom
11fd0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62  dev();.        b
11fe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
11ff0 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f      case flockLo
12000 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
12010 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63      /* flock loc
12020 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65  king doesn't nee
12030 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  d additional loc
12040 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f  kingContext info
12050 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
12060 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
12070 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b   = &sqlite3Flock
12080 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12090 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  hod;.        bre
120a0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64  ak;.      case d
120b0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
120c0 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  le: {.        /*
120d0 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67   dotlock locking
120e0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
120f0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
12100 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
12110 6e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n.         ** th
12120 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
12130 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20  Context */.     
12140 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
12150 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
12160 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
12170 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e3DotlockLocking
12180 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12190 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
121a0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c  ingContext = sql
121b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20  ite3_malloc(.   
121c0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f         sizeof(do
121d0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
121e0 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 6e  ext));.        n
121f0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65  Filename = strle
12200 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
12210 3b 0a 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c  ;.        ((dotl
12220 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
12230 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  t *)pNew->lockin
12240 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
12250 61 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ath = .         
12260 20 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f     sqlite3_mallo
12270 63 28 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  c( nFilename );.
12280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12290 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
122a0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
122b0 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f       ((dotlockLo
122c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
122d0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
122e0 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20  ext)->lockPath, 
122f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12300 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c   "%s.lock", zFil
12310 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
12320 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12330 20 20 20 20 20 63 61 73 65 20 70 6f 73 69 78 4c       case posixL
12340 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20  ockingStyle:.   
12350 20 20 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f       /* posix lo
12360 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65  cking doesn't ne
12370 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  ed additional lo
12380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66  ckingContext inf
12390 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
123a0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
123b0 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78  d = &sqlite3Unix
123c0 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20  IoMethod;.      
123d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
123e0 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79  ase noLockingSty
123f0 6c 65 3a 0a 20 20 20 20 20 20 63 61 73 65 20 75  le:.      case u
12400 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e  nsupportedLockin
12410 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 64 65  gStyle:.      de
12420 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20  fault: .        
12430 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
12440 26 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f  &sqlite3NolockLo
12450 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
12460 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 49  d;.    }.    *pI
12470 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65  d = (OsFile*)pNe
12480 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  w;.    OpenCount
12490 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74 75  er(+1);.    retu
124a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
124b0 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c  }.}.#else /* SQL
124c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
124d0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74  NG_STYLE */.stat
124e0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
124f0 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
12520 63 72 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20  criptor on file 
12530 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
12540 20 20 69 6e 74 20 64 69 72 66 64 2c 0a 20 20 73    int dirfd,.  s
12550 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
12560 2c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ,     /* Write t
12570 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
12580 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
12590 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
125a0 46 69 6c 65 6e 61 6d 65 20 20 2f 2a 20 4e 61 6d  Filename  /* Nam
125b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
125c0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b  ing opened */.){
125d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
125e0 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
125f0 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pId;.  int rc;..
12600 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
12610 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  C.  fcntl(h, F_S
12620 45 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46  ETFD, fcntl(h, F
12630 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
12640 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
12650 0a 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ..  enterMutex()
12660 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63  ;.  rc = findLoc
12670 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e  kInfo(h, &pNew->
12680 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f  pLock, &pNew->pO
12690 70 65 6e 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74  pen);.  leaveMut
126a0 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ex();.  if( rc )
126b0 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a  {.    close(h);.
126c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
126d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
126e0 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20  OSTRACE3("OPEN  
126f0 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
12700 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70   zFilename);.  p
12710 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  New->dirfd = -1;
12720 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
12730 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
12740 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52  dirfd;.  SET_THR
12750 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20 20  EADID(pNew);..  
12760 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
12770 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65  &sqlite3UnixIoMe
12780 74 68 6f 64 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  thod;.  OpenCoun
12790 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
127a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
127b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
127c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
127d0 54 59 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  TYLE */..#endif 
127e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
127f0 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  ISKIO */./******
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68  *****.** Everyth
12850 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20  ing above deals 
12860 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20  with file I/O.  
12870 45 76 65 72 79 74 68 69 6e 67 20 74 68 61 74 20  Everything that 
12880 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a  follows deals.**
12890 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63   with other misc
128a0 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73  ellanous aspects
128b0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   of the operatin
128c0 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
128d0 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12920 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  ..static int ope
12930 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
12940 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12950 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 63  , int *pFd){.  c
12960 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 3b 0a 20  har *zDirname;. 
12970 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
12980 64 3b 0a 0a 20 20 7a 44 69 72 6e 61 6d 65 20 3d  d;..  zDirname =
12990 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
129a0 5f 6d 61 6c 6c 6f 63 28 4d 41 58 5f 50 41 54 48  _malloc(MAX_PATH
129b0 4e 41 4d 45 29 3b 0a 20 20 69 66 28 20 21 7a 44  NAME);.  if( !zD
129c0 69 72 6e 61 6d 65 20 29 7b 0a 20 20 20 20 72 65  irname ){.    re
129d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
129e0 4d 3b 0a 20 20 7d 0a 20 20 73 74 72 6e 63 70 79  M;.  }.  strncpy
129f0 28 7a 44 69 72 6e 61 6d 65 2c 20 7a 46 69 6c 65  (zDirname, zFile
12a00 6e 61 6d 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  name, MAX_PATHNA
12a10 4d 45 29 3b 0a 20 20 7a 44 69 72 6e 61 6d 65 5b  ME);.  zDirname[
12a20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 31 5d 20  MAX_PATHNAME-1] 
12a30 3d 20 27 5c 30 27 3b 0a 20 20 66 6f 72 28 69 69  = '\0';.  for(ii
12a40 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  =strlen(zDirname
12a50 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72  ); ii>=0 && zDir
12a60 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
12a70 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
12a80 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
12a90 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
12aa0 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
12ab0 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
12ac0 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
12ad0 69 66 28 20 66 64 3e 30 20 29 7b 0a 23 69 66 64  if( fd>0 ){.#ifd
12ae0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
12af0 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
12b00 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c  SETFD, fcntl(fd,
12b10 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
12b20 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
12b30 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
12b40 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  3("OPENDIR %-3d 
12b50 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
12b60 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
12b70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12b80 44 69 72 6e 61 6d 65 29 3b 0a 20 20 2a 70 46 64  Dirname);.  *pFd
12b90 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
12ba0 28 66 64 3e 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  (fd>0?SQLITE_OK:
12bb0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
12bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 76 69  ;.}../*.** Previ
12bd0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
12be0 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
12bf0 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
12c00 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
12c10 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
12c20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
12c30 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
12c40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
12c50 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
12c60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
12c70 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
12c80 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
12c90 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
12ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
12cb0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
12cc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
12cd0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
12ce0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
12cf0 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
12d00 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
12d10 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
12d20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
12d30 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
12d40 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
12d50 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
12d60 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
12d70 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
12d80 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
12d90 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
12da0 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
12db0 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
12dc0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
12dd0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
12de0 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
12df0 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
12e00 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
12e10 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
12e20 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
12e30 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
12e40 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
12e50 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
12e60 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
12e70 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
12e80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
12e90 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 76 6f 69   unixOpen(.  voi
12ea0 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 0a 20 20  d *pNotUsed, .  
12eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
12ec0 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  h, .  sqlite3_fi
12ed0 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
12ee0 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
12ef0 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e  OutFlags.){.  in
12f00 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
12f30 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
12f40 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
12f50 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
12f60 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
12f70 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
12f80 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c  tor */.  int ofl
12f90 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
12fa0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
12fb0 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
12fc0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
12fd0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
12fe0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
12ff0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
13000 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
13010 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
13020 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
13030 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
13040 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
13050 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13060 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
13070 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
13080 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
13090 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
130a0 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
130b0 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
130c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
130d0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
130e0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
130f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
13100 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
13110 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
13120 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
13130 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
13140 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13150 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
13160 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
13170 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
13180 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
13190 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
131a0 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
131b0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
131c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
131d0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
131e0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
131f0 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
13200 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
13210 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
13220 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
13230 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
13240 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
13250 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
13260 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
13270 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
13280 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
13290 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
132a0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
132b0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
132c0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
132d0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
132e0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
132f0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
13300 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
13310 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
13320 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
13330 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
13340 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
13350 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
13360 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
13370 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
13380 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
13390 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
133a0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
133b0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
133c0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
133d0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
133e0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
133f0 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
13400 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
13410 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
13420 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
13430 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
13440 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
13450 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
13460 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
13470 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
13480 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
13490 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
134a0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
134b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
134c0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
134d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
134e0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
134f0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
13500 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
13510 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
13520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
13530 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b  ER_JOURNAL .  );
13540 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ..  if( isReadon
13550 6c 79 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20  ly )  oflags |= 
13560 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
13570 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 66  isReadWrite ) of
13580 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
13590 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
135a0 20 20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f      oflags |= O_
135b0 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
135c0 78 63 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67  xclusive ) oflag
135d0 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
135e0 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61  OFOLLOW);.  ofla
135f0 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
13600 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
13610 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
13620 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
13630 65 29 29 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e  e));.  fd = open
13640 28 7a 50 61 74 68 2c 20 6f 66 6c 61 67 73 2c 20  (zPath, oflags, 
13650 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51  isDelete?0600:SQ
13660 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
13670 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
13680 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 69 73    if( fd<0 && is
13690 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
136a0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
136b0 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
136c0 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
136d0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
136e0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
136f0 2e 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26  . */.    flags &
13700 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
13710 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
13720 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
13730 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
13740 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
13750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
13760 78 4f 70 65 6e 28 70 4e 6f 74 55 73 65 64 2c 20  xOpen(pNotUsed, 
13770 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c  zPath, pFile, fl
13780 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  ags, pOutFlags);
13790 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
137a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
137b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
137c0 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74   }.  if( isDelet
137d0 65 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  e ){.    unlink(
137e0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zPath);.  }.  if
137f0 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
13800 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
13810 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73  flags;.  }..  as
13820 73 65 72 74 28 66 64 21 3d 30 29 3b 0a 20 20 69  sert(fd!=0);.  i
13830 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  f( isOpenDirecto
13840 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ry ){.    int rc
13850 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
13860 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
13870 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13890 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 20  close(fd);.     
138a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
138b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
138c0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 66 64  illInUnixFile(fd
138d0 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
138e0 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
138f0 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
13900 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
13910 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
13920 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
13930 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
13940 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
13950 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
13960 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13970 44 65 6c 65 74 65 28 76 6f 69 64 20 2a 70 4e 6f  Delete(void *pNo
13980 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
13990 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
139a0 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  rSync){.  int rc
139b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
139c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
139d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
139e0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75  ERR_DELETE);.  u
139f0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20  nlink(zPath);.  
13a00 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20  if( dirSync ){. 
13a10 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72     int fd;.    r
13a20 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
13a30 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
13a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
13a60 28 20 66 73 79 6e 63 28 66 64 29 20 29 7b 0a 20  ( fsync(fd) ){. 
13a70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13a80 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
13a90 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
13aa0 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
13ab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13ac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
13ad0 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
13ae0 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
13af0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
13b00 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
13b10 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
13b20 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
13b30 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
13b40 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
13b50 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
13b60 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
13b70 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
13b80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
13b90 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
13ba0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
13bb0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
13bc0 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
13bd0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
13be0 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
13bf0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
13c00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
13c10 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
13c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
13c30 78 41 63 63 65 73 73 28 76 6f 69 64 20 2a 70 4e  xAccess(void *pN
13c40 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
13c50 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
13c60 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 61 6d 6f  lags){.  int amo
13c70 64 65 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  de;.  switch( fl
13c80 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
13c90 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
13ca0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
13cb0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
13cc0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13cd0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
13ce0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
13cf0 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
13d00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13d10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
13d20 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 0a  CCESS_READONLY:.
13d30 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
13d40 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
13d50 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
13d60 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
13d70 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
13d80 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 72 65  ment");.  }.  re
13d90 74 75 72 6e 20 28 61 63 63 65 73 73 28 7a 50 61  turn (access(zPa
13da0 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a  th, amode)==0);.
13db0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
13dc0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
13dd0 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
13de0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
13df0 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
13e00 6c 64 20 61 74 20 6c 65 61 73 74 20 4d 41 58 5f  ld at least MAX_
13e10 50 41 54 48 4e 41 4d 45 20 63 68 61 72 61 63 74  PATHNAME charact
13e20 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
13e30 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 4e 61  nt unixGetTempNa
13e40 6d 65 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65  me(void *pNotUse
13e50 64 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  d, char *zBuf){.
13e60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
13e70 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
13e80 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
13e90 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
13ea0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
13eb0 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
13ec0 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
13ed0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
13ee0 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
13ef0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
13f00 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
13f10 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
13f20 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
13f30 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
13f40 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
13f50 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
13f60 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
13f70 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
13f80 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
13f90 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
13fa0 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
13fb0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
13fc0 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
13fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13fe0 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
13ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14000 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
14010 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
14020 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
14030 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
14040 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14050 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
14060 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
14070 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
14080 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
14090 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
140a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
140b0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
140c0 41 4d 45 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25  AME-17, zBuf, "%
140d0 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  s/"TEMP_FILE_PRE
140e0 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
140f0 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
14100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  ;.    sqlite3Ran
14110 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
14120 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
14130 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
14140 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
14150 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
14160 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
14170 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
14180 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
14190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
141a0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
141b0 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
141c0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
141d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
141e0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
141f0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
14200 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
14210 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
14220 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
14230 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
14240 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
14250 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
14260 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
14270 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
14280 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
14290 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
142a0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
142b0 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
142c0 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
142d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
142e0 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
142f0 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
14300 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
14310 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14330 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
14340 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c  (void *pNotUsed,
14350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
14360 74 68 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 7b  th, char *zOut){
14370 0a 20 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48  .  zOut[MAX_PATH
14380 4e 41 4d 45 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  NAME-1] = '\0';.
14390 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
143a0 27 2f 27 20 29 7b 0a 20 20 20 20 73 74 72 6e 63  '/' ){.    strnc
143b0 70 79 28 7a 4f 75 74 2c 20 7a 50 61 74 68 2c 20  py(zOut, zPath, 
143c0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 31 29 3b  MAX_PATHNAME-1);
143d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
143e0 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
143f0 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 4d 41 58  getcwd(zOut, MAX
14400 5f 50 41 54 48 4e 41 4d 45 2d 31 29 3d 3d 30 20  _PATHNAME-1)==0 
14410 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14420 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14430 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73    }.    nCwd = s
14440 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
14450 20 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20 27 2f   zOut[nCwd] = '/
14460 27 3b 0a 20 20 20 20 73 74 72 6e 63 70 79 28 26  ';.    strncpy(&
14470 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20 7a 50  zOut[nCwd+1], zP
14480 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d  ath, MAX_PATHNAM
14490 45 2d 31 2d 6e 43 77 64 2d 31 29 3b 0a 20 20 7d  E-1-nCwd-1);.  }
144a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
144b0 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  _OK;..#if 0.  /*
144c0 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e  .  ** Remove "/.
144d0 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
144e0 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41   and convert "/A
144f0 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e  /./" path elemen
14500 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20  ts.  ** to just 
14510 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  "/"..  */.  if( 
14520 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74  zFull ){.    int
14530 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69   i, j;.    for(i
14540 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20  =j=0; zFull[i]; 
14550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14560 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b  zFull[i]=='/' ){
14570 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75  .        if( zFu
14580 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63  ll[i+1]=='/' ) c
14590 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
145a0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
145b0 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
145c0 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  2]=='/' ){.     
145d0 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
145e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
145f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14600 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31     if( zFull[i+1
14610 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
14620 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+2]=='.' && zFu
14630 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a  ll[i+3]=='/' ){.
14640 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
14650 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d   j>0 && zFull[j-
14660 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
14670 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  }.          i +=
14680 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   3;.          co
14690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
146a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
146b0 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75  zFull[j++] = zFu
146c0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ll[i];.    }.   
146d0 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20   zFull[j] = 0;. 
146e0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69   }.#endif.}...#i
146f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14700 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
14710 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
14720 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
14730 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
14740 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
14750 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
14760 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
14770 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
14780 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
14790 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
147a0 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
147b0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
147c0 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c  (void *pNotUsed,
147d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
147e0 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
147f0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
14800 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
14810 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 73  TLD_GLOBAL);.}.s
14820 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
14830 6c 45 72 72 6f 72 28 76 6f 69 64 20 2a 70 4e 6f  lError(void *pNo
14840 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
14850 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
14860 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
14870 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
14880 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
14890 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
148a0 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a 42 75  .    strncpy(zBu
148b0 66 4f 75 74 2c 20 7a 45 72 72 2c 20 6e 42 75 66  fOut, zErr, nBuf
148c0 2d 31 29 3b 0a 20 20 20 20 7a 42 75 66 4f 75 74  -1);.    zBufOut
148d0 5b 6e 42 75 66 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nBuf-1] = '\0';
148e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 6e 42 75 66  .  }else if(nBuf
148f0 3e 30 29 20 7b 0a 20 20 20 20 7a 42 75 66 4f 75  >0) {.    zBufOu
14900 74 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  t[0] = '\0';.  }
14910 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
14920 0a 7d 0a 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53  .}.void *unixDlS
14930 79 6d 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  ym(void *pHandle
14940 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
14950 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72 6e  ymbol){.  return
14960 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20   dlsym(pHandle, 
14970 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 76 6f 69 64  zSymbol);.}.void
14980 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 76 6f 69   unixDlClose(voi
14990 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 64  d *pHandle){.  d
149a0 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
149b0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
149c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
149d0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
149e0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
149f0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
14a00 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
14a10 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
14a20 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
14a30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
14a40 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
14a50 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
14a60 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
14a70 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
14a80 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
14a90 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
14aa0 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
14ab0 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c  (void *pNotUsed,
14ac0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
14ad0 2a 7a 42 75 66 29 7b 0a 0a 20 20 61 73 73 65 72  *zBuf){..  asser
14ae0 74 28 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t(nBuf>=(sizeof(
14af0 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
14b00 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
14b10 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
14b20 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
14b30 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
14b40 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
14b50 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
14b60 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
14b70 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
14b80 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
14b90 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
14ba0 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
14bb0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
14bc0 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
14bd0 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
14be0 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
14bf0 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
14c00 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
14c10 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
14c20 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
14c30 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
14c40 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
14c50 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
14c60 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
14c70 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
14c80 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
14c90 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
14ca0 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
14cb0 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
14cc0 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
14cd0 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
14ce0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
14cf0 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
14d00 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
14d10 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
14d20 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
14d30 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
14d40 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
14d50 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
14d60 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
14d70 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
14d80 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
14d90 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
14da0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
14db0 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
14dc0 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
14dd0 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
14de0 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
14df0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
14e00 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
14e10 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
14e20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
14e30 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
14e40 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
14e50 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
14e60 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
14e70 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
14e80 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
14e90 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
14ea0 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   zBuf, nBuf);.  
14eb0 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20      close(fd);. 
14ec0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ee0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  OK;.}.../*.** Sl
14ef0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
14f00 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
14f10 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
14f20 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
14f30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
14f40 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
14f50 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
14f60 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a 73 74 61  to sleep..*/.sta
14f70 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
14f80 70 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64  p(void *pNotUsed
14f90 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
14fa0 64 73 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ds){.#if defined
14fb0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
14fc0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
14fd0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
14fe0 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ds);.  return mi
14ff0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
15000 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
15010 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
15020 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
15030 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
15040 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
15050 6e 64 73 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  nds;.#endif.}../
15060 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15070 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
15080 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
15090 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73  o value, becomes
150a0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72   the result.** r
150b0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c  eturned from sql
150c0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
150d0 65 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73  e().  This is us
150e0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a  ed for testing..
150f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15100 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
15110 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
15120 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
15130 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
15140 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
15150 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
15160 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
15170 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
15180 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
15190 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
151a0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
151b0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
151c0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
151d0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
151e0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
151f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
15200 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 76  nixCurrentTime(v
15210 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 64  oid *pNotUsed, d
15220 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23  ouble *prNow){.#
15230 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a  ifdef NO_GETTOD.
15240 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
15250 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
15260 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
15270 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a  440587.5;.#else.
15280 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
15290 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65   sNow;.  gettime
152a0 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b  ofday(&sNow, 0);
152b0 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30  .  *prNow = 2440
152c0 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f  587.5 + sNow.tv_
152d0 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e  sec/86400.0 + sN
152e0 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30  ow.tv_usec/86400
152f0 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66  000000.0;.#endif
15300 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15310 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
15320 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
15330 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73  {.    *prNow = s
15340 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
15350 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  ime/86400.0 + 24
15360 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e  40587.5;.  }.#en
15370 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  dif.  return 0;.
15380 7d 0a 0a 0a 73 71 6c 69 74 65 33 5f 76 66 73 20  }...sqlite3_vfs 
15390 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 56 66  sqlite3DefaultVf
153a0 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20  s = {.  1,      
153b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
153c0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 69 7a  Version */.  siz
153d0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
153e0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
153f0 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
15400 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
15410 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15430 6e 52 65 66 20 2a 2f 0a 20 20 30 2c 20 20 20 20  nRef */.  0,    
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15450 20 76 66 73 4d 75 74 65 78 20 2a 2f 0a 20 20 30   vfsMutex */.  0
15460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15470 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
15480 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
15490 20 20 20 20 20 2f 2a 20 70 50 72 65 76 20 2a 2f       /* pPrev */
154a0 0a 20 20 22 75 6e 69 78 22 2c 20 20 20 20 20 20  .  "unix",      
154b0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
154c0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
154d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
154e0 44 61 74 61 20 2a 2f 0a 0a 20 20 75 6e 69 78 4f  Data */..  unixO
154f0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
15500 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 75 6e 69  * xOpen */.  uni
15510 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  xDelete,        
15520 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
15530 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20   unixAccess,    
15540 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
15550 2a 2f 0a 20 20 75 6e 69 78 47 65 74 54 65 6d 70  */.  unixGetTemp
15560 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 78 47 65 74  Name,    /* xGet
15570 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a 20 20 75 6e  TempName */.  un
15580 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  ixFullPathname, 
15590 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
155a0 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 44 6c 4f 70  me */.  unixDlOp
155b0 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  en,         /* x
155c0 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 75 6e 69 78  DlOpen */.  unix
155d0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
155e0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
155f0 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20   unixDlSym,     
15600 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
15610 2f 0a 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c  /.  unixDlClose,
15620 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
15630 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 52 61 6e  ose */.  unixRan
15640 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20  domness,     /* 
15650 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
15660 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
15670 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
15680 2f 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54  /.  unixCurrentT
15690 69 6d 65 20 20 20 20 20 2f 2a 20 78 43 75 72 72  ime     /* xCurr
156a0 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a 20 0a  entTime */.};. .
156b0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49  #endif /* OS_UNI
156c0 58 20 2a 2f 0a                                   X */.