/ Hex Artifact Content
Login

Artifact 250a3789be609adfee5c5aa20137ce8683276f24:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68  mber 16.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
0180: 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 66 69  * This header fi
0190: 6c 65 20 28 74 6f 67 65 74 68 65 72 20 77 69 74  le (together wit
01a0: 68 20 69 73 20 63 6f 6d 70 61 6e 69 6f 6e 20 43  h is companion C
01b0: 20 73 6f 75 72 63 65 2d 63 6f 64 65 20 66 69 6c   source-code fil
01c0: 65 0a 2a 2a 20 22 6f 73 2e 63 22 29 20 61 74 74  e.** "os.c") att
01d0: 65 6d 70 74 20 74 6f 20 61 62 73 74 72 61 63 74  empt to abstract
01e0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
01f0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
0200: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
0210: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 77  SQLite library w
0220: 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 62 6f 74 68  ill work on both
0230: 20 50 4f 53 49 58 20 61 6e 64 20 77 69 6e 64 6f   POSIX and windo
0240: 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
0250: 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 45 5f 4f  ifndef _SQLITE_O
0260: 53 5f 48 5f 0a 23 64 65 66 69 6e 65 20 5f 53 51  S_H_.#define _SQ
0270: 4c 49 54 45 5f 4f 53 5f 48 5f 0a 0a 2f 2a 0a 2a  LITE_OS_H_../*.*
0280: 2a 20 48 65 6c 70 66 75 6c 20 68 69 6e 74 3a 20  * Helpful hint: 
0290: 20 54 6f 20 67 65 74 20 74 68 69 73 20 74 6f 20   To get this to 
02a0: 63 6f 6d 70 69 6c 65 20 6f 6e 20 48 50 2f 55 58  compile on HP/UX
02b0: 2c 20 61 64 64 20 2d 44 5f 49 4e 43 4c 55 44 45  , add -D_INCLUDE
02c0: 5f 50 4f 53 49 58 5f 53 4f 55 52 43 45 0a 2a 2a  _POSIX_SOURCE.**
02d0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
02e0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a   command line..*
02f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 23  /../*.** These #
0300: 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20 65  defines should e
0310: 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65 20  nable >2GB file 
0320: 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69 78  support on Posix
0330: 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72   if the.** under
0340: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0350: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
0360: 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20 6c  it.  If the OS l
0370: 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66 69  acks.** large fi
0380: 6c 65 20 73 75 70 70 6f 72 74 2c 20 6f 72 20 69  le support, or i
0390: 66 20 74 68 65 20 4f 53 20 69 73 20 77 69 6e 64  f the OS is wind
03a0: 6f 77 73 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ows, these shoul
03b0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
03c0: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
03d0: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
03e0: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
03f0: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0400: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0410: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0420: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0430: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0440: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0450: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
0460: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
0470: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
0480: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
0490: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
04a0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
04b0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
04c0: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
04d0: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
04e0: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
04f0: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0500: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0510: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0520: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0530: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0540: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0550: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
0560: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
0570: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
0580: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
0590: 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a 20 53  mit LFS..**.** S
05a0: 69 6d 69 6c 61 72 20 69 73 20 74 72 75 65 20 66  imilar is true f
05b0: 6f 72 20 4d 61 63 4f 53 2e 20 20 4c 46 53 20 69  or MacOS.  LFS i
05c0: 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
05d0: 20 6f 6e 20 4d 61 63 4f 53 20 39 20 61 6e 64 20   on MacOS 9 and 
05e0: 6c 61 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  later..*/.#ifnde
05f0: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
0600: 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f 4c  _LFS.# define _L
0610: 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20 20  ARGE_FILE       
0620: 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c 45  1.# ifndef _FILE
0630: 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20 20  _OFFSET_BITS.#  
0640: 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f 46   define _FILE_OF
0650: 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20 65  FSET_BITS 64.# e
0660: 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f 4c  ndif.# define _L
0670: 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45 20  ARGEFILE_SOURCE 
0680: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
0690: 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
06a0: 61 72 65 20 6e 61 6d 65 64 20 73 74 61 72 74 69  are named starti
06b0: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 65  ng with this pre
06c0: 66 69 78 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  fix followed by 
06d0: 31 36 20 72 61 6e 64 6f 6d 0a 2a 2a 20 61 6c 70  16 random.** alp
06e0: 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  hanumeric charac
06f0: 74 65 72 73 2c 20 61 6e 64 20 6e 6f 20 66 69 6c  ters, and no fil
0700: 65 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 68 65  e extension. The
0710: 79 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  y are stored in 
0720: 74 68 65 0a 2a 2a 20 4f 53 27 73 20 73 74 61 6e  the.** OS's stan
0730: 64 61 72 64 20 74 65 6d 70 6f 72 61 72 79 20 66  dard temporary f
0740: 69 6c 65 20 64 69 72 65 63 74 6f 72 79 2c 20 61  ile directory, a
0750: 6e 64 20 61 72 65 20 64 65 6c 65 74 65 64 20 70  nd are deleted p
0760: 72 69 6f 72 20 74 6f 20 65 78 69 74 2e 0a 2a 2a  rior to exit..**
0770: 20 49 66 20 73 71 6c 69 74 65 20 69 73 20 62 65   If sqlite is be
0780: 69 6e 67 20 65 6d 62 65 64 64 65 64 20 69 6e 20  ing embedded in 
0790: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2c  another program,
07a0: 20 79 6f 75 20 6d 61 79 20 77 69 73 68 20 74 6f   you may wish to
07b0: 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20 70   change the.** p
07c0: 72 65 66 69 78 20 74 6f 20 72 65 66 6c 65 63 74  refix to reflect
07d0: 20 79 6f 75 72 20 70 72 6f 67 72 61 6d 27 73 20   your program's 
07e0: 6e 61 6d 65 2c 20 73 6f 20 74 68 61 74 20 69 66  name, so that if
07f0: 20 79 6f 75 72 20 70 72 6f 67 72 61 6d 20 65 78   your program ex
0800: 69 74 73 0a 2a 2a 20 70 72 65 6d 61 74 75 72 65  its.** premature
0810: 6c 79 2c 20 6f 6c 64 20 74 65 6d 70 6f 72 61 72  ly, old temporar
0820: 79 20 66 69 6c 65 73 20 63 61 6e 20 62 65 20 65  y files can be e
0830: 61 73 69 6c 79 20 69 64 65 6e 74 69 66 69 65 64  asily identified
0840: 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 64 6f  . This can be do
0850: 6e 65 0a 2a 2a 20 75 73 69 6e 67 20 2d 44 54 45  ne.** using -DTE
0860: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 3d 6d  MP_FILE_PREFIX=m
0870: 79 70 72 65 66 69 78 5f 20 6f 6e 20 74 68 65 20  yprefix_ on the 
0880: 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64  compiler command
0890: 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   line..*/.#ifnde
08a0: 66 20 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  f TEMP_FILE_PREF
08b0: 49 58 0a 23 20 64 65 66 69 6e 65 20 54 45 4d 50  IX.# define TEMP
08c0: 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 22 73 71  _FILE_PREFIX "sq
08d0: 6c 69 74 65 5f 22 0a 23 65 6e 64 69 66 0a 0a 2f  lite_".#endif../
08e0: 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20  *.** Figure out 
08f0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
0900: 67 20 77 69 74 68 20 55 6e 69 78 2c 20 57 69 6e  g with Unix, Win
0910: 64 6f 77 73 20 6f 72 20 4d 61 63 4f 53 2e 0a 2a  dows or MacOS..*
0920: 2a 0a 2a 2a 20 4e 2e 42 2e 20 4d 61 63 4f 53 20  *.** N.B. MacOS 
0930: 6d 65 61 6e 73 20 4d 61 63 20 43 6c 61 73 73 69  means Mac Classi
0940: 63 20 28 6f 72 20 43 61 72 62 6f 6e 29 2e 20 54  c (or Carbon). T
0950: 72 65 61 74 20 44 61 72 77 69 6e 20 28 4f 53 20  reat Darwin (OS 
0960: 58 29 20 61 73 20 55 6e 69 78 2e 0a 2a 2a 20 20  X) as Unix..**  
0970: 20 20 20 20 54 68 65 20 4d 61 63 4f 53 20 62 75      The MacOS bu
0980: 69 6c 64 20 69 73 20 64 65 73 69 67 6e 65 64 20  ild is designed 
0990: 74 6f 20 75 73 65 20 43 6f 64 65 57 61 72 72 69  to use CodeWarri
09a0: 6f 72 20 28 74 65 73 74 65 64 20 77 69 74 68 20  or (tested with 
09b0: 76 38 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  v8).*/.#ifndef O
09c0: 53 5f 55 4e 49 58 0a 23 20 69 66 6e 64 65 66 20  S_UNIX.# ifndef 
09d0: 4f 53 5f 57 49 4e 0a 23 20 20 69 66 6e 64 65 66  OS_WIN.#  ifndef
09e0: 20 4f 53 5f 4d 41 43 0a 23 20 20 20 20 69 66 20   OS_MAC.#    if 
09f0: 64 65 66 69 6e 65 64 28 5f 5f 4d 41 43 4f 53 5f  defined(__MACOS_
0a00: 5f 29 0a 23 20 20 20 20 20 20 64 65 66 69 6e 65  _).#      define
0a10: 20 4f 53 5f 4d 41 43 20 31 0a 23 20 20 20 20 20   OS_MAC 1.#     
0a20: 20 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20 30   define OS_WIN 0
0a30: 0a 23 20 20 20 20 20 20 64 65 66 69 6e 65 20 4f  .#      define O
0a40: 53 5f 55 4e 49 58 20 30 0a 23 20 20 20 20 65 6c  S_UNIX 0.#    el
0a50: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0a60: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
0a70: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0a80: 5f 5f 43 59 47 57 49 4e 5f 5f 29 20 7c 7c 20 64  __CYGWIN__) || d
0a90: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0aa0: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
0ab0: 5f 42 4f 52 4c 41 4e 44 43 5f 5f 29 0a 23 20 20  _BORLANDC__).#  
0ac0: 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 4d 41      define OS_MA
0ad0: 43 20 30 0a 23 20 20 20 20 20 20 64 65 66 69 6e  C 0.#      defin
0ae0: 65 20 4f 53 5f 57 49 4e 20 31 0a 23 20 20 20 20  e OS_WIN 1.#    
0af0: 20 20 64 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58    define OS_UNIX
0b00: 20 30 0a 23 20 20 20 20 65 6c 73 65 0a 23 20 20   0.#    else.#  
0b10: 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 4d 41      define OS_MA
0b20: 43 20 30 0a 23 20 20 20 20 20 20 64 65 66 69 6e  C 0.#      defin
0b30: 65 20 4f 53 5f 57 49 4e 20 30 0a 23 20 20 20 20  e OS_WIN 0.#    
0b40: 20 20 64 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58    define OS_UNIX
0b50: 20 31 0a 23 20 20 20 20 65 6e 64 69 66 0a 23 20   1.#    endif.# 
0b60: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
0b70: 65 20 4f 53 5f 57 49 4e 20 30 0a 23 20 20 20 20  e OS_WIN 0.#    
0b80: 64 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58 20 30  define OS_UNIX 0
0b90: 0a 23 20 20 65 6e 64 69 66 0a 23 20 65 6c 73 65  .#  endif.# else
0ba0: 0a 23 20 20 64 65 66 69 6e 65 20 4f 53 5f 4d 41  .#  define OS_MA
0bb0: 43 20 30 0a 23 20 20 64 65 66 69 6e 65 20 4f 53  C 0.#  define OS
0bc0: 5f 55 4e 49 58 20 30 0a 23 20 65 6e 64 69 66 0a  _UNIX 0.# endif.
0bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f  #else.# define O
0be0: 53 5f 4d 41 43 20 30 0a 23 20 69 66 6e 64 65 66  S_MAC 0.# ifndef
0bf0: 20 4f 53 5f 57 49 4e 0a 23 20 20 64 65 66 69 6e   OS_WIN.#  defin
0c00: 65 20 4f 53 5f 57 49 4e 20 30 0a 23 20 65 6e 64  e OS_WIN 0.# end
0c10: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
0c20: 20 41 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e   A handle for an
0c30: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 73 74   open file is st
0c40: 6f 72 65 64 20 69 6e 20 61 6e 20 4f 73 46 69 6c  ored in an OsFil
0c50: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 23 69 66  e object..*/.#if
0c60: 20 4f 53 5f 55 4e 49 58 0a 23 20 69 6e 63 6c 75   OS_UNIX.# inclu
0c70: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
0c80: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0c90: 73 74 61 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  stat.h>.# includ
0ca0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 69 6e  e <fcntl.h>.# in
0cb0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0cc0: 0a 20 20 74 79 70 65 64 65 66 20 73 74 72 75 63  .  typedef struc
0cd0: 74 20 4f 73 46 69 6c 65 20 4f 73 46 69 6c 65 3b  t OsFile OsFile;
0ce0: 0a 20 20 73 74 72 75 63 74 20 4f 73 46 69 6c 65  .  struct OsFile
0cf0: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70   {.    struct op
0d00: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0d10: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0d20: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0d30: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0d40: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
0d50: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49  o *pLock;   /* I
0d60: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
0d70: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
0d80: 0a 20 20 20 20 69 6e 74 20 66 64 3b 20 20 20 20  .    int fd;    
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0da0: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
0db0: 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  iptor */.    int
0dc0: 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
0dd0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0de0: 66 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20  f this instance 
0df0: 68 6f 6c 64 73 20 74 68 65 20 6c 6f 63 6b 20 2a  holds the lock *
0e00: 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  /.    int dirfd;
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
0e30: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
0e40: 74 6f 72 79 20 2a 2f 0a 20 20 7d 3b 0a 23 20 64  tory */.  };.# d
0e50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 4d  efine SQLITE_TEM
0e60: 50 4e 41 4d 45 5f 53 49 5a 45 20 32 30 30 0a 23  PNAME_SIZE 200.#
0e70: 20 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45   if defined(HAVE
0e80: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
0e90: 5f 55 53 4c 45 45 50 0a 23 20 20 64 65 66 69 6e  _USLEEP.#  defin
0ea0: 65 20 53 51 4c 49 54 45 5f 4d 49 4e 5f 53 4c 45  e SQLITE_MIN_SLE
0eb0: 45 50 5f 4d 53 20 31 0a 23 20 65 6c 73 65 0a 23  EP_MS 1.# else.#
0ec0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0ed0: 4d 49 4e 5f 53 4c 45 45 50 5f 4d 53 20 31 30 30  MIN_SLEEP_MS 100
0ee0: 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  0.# endif.#endif
0ef0: 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 23 69 6e  ..#if OS_WIN.#in
0f00: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
0f10: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62  >.#include <winb
0f20: 61 73 65 2e 68 3e 0a 20 20 74 79 70 65 64 65 66  ase.h>.  typedef
0f30: 20 73 74 72 75 63 74 20 4f 73 46 69 6c 65 20 4f   struct OsFile O
0f40: 73 46 69 6c 65 3b 0a 20 20 73 74 72 75 63 74 20  sFile;.  struct 
0f50: 4f 73 46 69 6c 65 20 7b 0a 20 20 20 20 48 41 4e  OsFile {.    HAN
0f60: 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20  DLE h;          
0f70: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
0f80: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  or accessing the
0f90: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
0fa0: 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
0fb0: 20 20 20 20 20 2f 2a 20 30 3a 20 75 6e 6c 6f 63       /* 0: unloc
0fc0: 6b 65 64 2c 20 3c 30 3a 20 77 72 69 74 65 20 6c  ked, <0: write l
0fd0: 6f 63 6b 2c 20 3e 30 3a 20 72 65 61 64 20 6c 6f  ock, >0: read lo
0fe0: 63 6b 20 2a 2f 0a 20 20 7d 3b 0a 23 20 69 66 20  ck */.  };.# if 
0ff0: 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
1000: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 42  ) || defined(__B
1010: 4f 52 4c 41 4e 44 43 5f 5f 29 0a 20 20 20 20 74  ORLANDC__).    t
1020: 79 70 65 64 65 66 20 5f 5f 69 6e 74 36 34 20 6f  ypedef __int64 o
1030: 66 66 5f 74 3b 0a 23 20 65 6c 73 65 0a 23 20 20  ff_t;.# else.#  
1040: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 43 59 47  if !defined(_CYG
1050: 57 49 4e 5f 54 59 50 45 53 5f 48 29 0a 20 20 20  WIN_TYPES_H).   
1060: 20 20 74 79 70 65 64 65 66 20 6c 6f 6e 67 20 6c    typedef long l
1070: 6f 6e 67 20 6f 66 66 5f 74 3b 0a 23 20 20 20 20  ong off_t;.#    
1080: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
1090: 47 57 33 32 5f 5f 29 0a 23 20 20 20 20 20 20 64  GW32__).#      d
10a0: 65 66 69 6e 65 09 5f 4f 46 46 5f 54 5f 0a 23 20  efine._OFF_T_.# 
10b0: 20 20 20 65 6e 64 69 66 0a 23 20 20 65 6e 64 69     endif.#  endi
10c0: 66 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  f.# endif.# defi
10d0: 6e 65 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  ne SQLITE_TEMPNA
10e0: 4d 45 5f 53 49 5a 45 20 28 4d 41 58 5f 50 41 54  ME_SIZE (MAX_PAT
10f0: 48 2b 35 30 29 0a 23 20 64 65 66 69 6e 65 20 53  H+50).# define S
1100: 51 4c 49 54 45 5f 4d 49 4e 5f 53 4c 45 45 50 5f  QLITE_MIN_SLEEP_
1110: 4d 53 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  MS 1.#endif..#if
1120: 20 4f 53 5f 4d 41 43 0a 23 20 69 6e 63 6c 75 64   OS_MAC.# includ
1130: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69  e <unistd.h>.# i
1140: 6e 63 6c 75 64 65 20 3c 46 69 6c 65 73 2e 68 3e  nclude <Files.h>
1150: 0a 20 20 74 79 70 65 64 65 66 20 73 74 72 75 63  .  typedef struc
1160: 74 20 4f 73 46 69 6c 65 20 4f 73 46 69 6c 65 3b  t OsFile OsFile;
1170: 0a 20 20 73 74 72 75 63 74 20 4f 73 46 69 6c 65  .  struct OsFile
1180: 20 7b 0a 20 20 20 20 53 49 6e 74 31 36 20 72 65   {.    SInt16 re
1190: 66 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  fNum;           
11a0: 2f 2a 20 44 61 74 61 20 66 6f 72 6b 2f 66 69 6c  /* Data fork/fil
11b0: 65 20 72 65 66 65 72 65 6e 63 65 20 6e 75 6d 62  e reference numb
11c0: 65 72 20 2a 2f 0a 20 20 20 20 53 49 6e 74 31 36  er */.    SInt16
11d0: 20 72 65 66 4e 75 6d 52 46 3b 20 20 20 20 20 20   refNumRF;      
11e0: 20 20 20 2f 2a 20 52 65 73 6f 75 72 63 65 20 66     /* Resource f
11f0: 6f 72 6b 20 72 65 66 65 72 65 6e 63 65 20 6e 75  ork reference nu
1200: 6d 62 65 72 20 28 66 6f 72 20 6c 6f 63 6b 69 6e  mber (for lockin
1210: 67 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 6f  g) */.    int lo
1220: 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
1230: 20 20 20 2f 2a 20 30 3a 20 75 6e 6c 6f 63 6b 65     /* 0: unlocke
1240: 64 2c 20 3c 30 3a 20 77 72 69 74 65 20 6c 6f 63  d, <0: write loc
1250: 6b 2c 20 3e 30 3a 20 72 65 61 64 20 6c 6f 63 6b  k, >0: read lock
1260: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 65 6c 4f   */.    int delO
1270: 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20  nClose;         
1280: 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69 6c 65   /* True if file
1290: 20 69 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65   is to be delete
12a0: 64 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  d on close */.  
12b0: 20 20 63 68 61 72 20 2a 70 61 74 68 54 6f 44 65    char *pathToDe
12c0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  l;         /* Na
12d0: 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
12e0: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
12f0: 0a 20 20 7d 3b 0a 23 20 69 66 64 65 66 20 5f 4c  .  };.# ifdef _L
1300: 41 52 47 45 5f 46 49 4c 45 0a 20 20 20 20 74 79  ARGE_FILE.    ty
1310: 70 65 64 65 66 20 53 49 6e 74 36 34 20 6f 66 66  pedef SInt64 off
1320: 5f 74 3b 0a 23 20 65 6c 73 65 0a 20 20 20 20 74  _t;.# else.    t
1330: 79 70 65 64 65 66 20 53 49 6e 74 33 32 20 6f 66  ypedef SInt32 of
1340: 66 5f 74 3b 0a 23 20 65 6e 64 69 66 0a 23 20 64  f_t;.# endif.# d
1350: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 4d  efine SQLITE_TEM
1360: 50 4e 41 4d 45 5f 53 49 5a 45 20 5f 4d 41 58 5f  PNAME_SIZE _MAX_
1370: 50 41 54 48 0a 23 20 64 65 66 69 6e 65 20 53 51  PATH.# define SQ
1380: 4c 49 54 45 5f 4d 49 4e 5f 53 4c 45 45 50 5f 4d  LITE_MIN_SLEEP_M
1390: 53 20 31 37 0a 23 65 6e 64 69 66 0a 0a 69 6e 74  S 17.#endif..int
13a0: 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28   sqliteOsDelete(
13b0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 69 6e  const char*);.in
13c0: 74 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45 78  t sqliteOsFileEx
13d0: 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 2a  ists(const char*
13e0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46  );.int sqliteOsF
13f0: 69 6c 65 52 65 6e 61 6d 65 28 63 6f 6e 73 74 20  ileRename(const 
1400: 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61  char*, const cha
1410: 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f  r*);.int sqliteO
1420: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 63  sOpenReadWrite(c
1430: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
1440: 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e 74 20  le*, int*);.int 
1450: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
1460: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
1470: 2a 2c 20 4f 73 46 69 6c 65 2a 2c 20 69 6e 74 29  *, OsFile*, int)
1480: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70  ;.int sqliteOsOp
1490: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
14a0: 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 29   char*, OsFile*)
14b0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70  ;.int sqliteOsOp
14c0: 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
14d0: 74 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a  t char*, OsFile*
14e0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54  );.int sqliteOsT
14f0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72  empFileName(char
1500: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73  *);.int sqliteOs
1510: 43 6c 6f 73 65 28 4f 73 46 69 6c 65 2a 29 3b 0a  Close(OsFile*);.
1520: 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 65 61 64  int sqliteOsRead
1530: 28 4f 73 46 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c  (OsFile*, void*,
1540: 20 69 6e 74 20 61 6d 74 29 3b 0a 69 6e 74 20 73   int amt);.int s
1550: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 4f 73 46  qliteOsWrite(OsF
1560: 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64  ile*, const void
1570: 2a 2c 20 69 6e 74 20 61 6d 74 29 3b 0a 69 6e 74  *, int amt);.int
1580: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 4f 73   sqliteOsSeek(Os
1590: 46 69 6c 65 2a 2c 20 6f 66 66 5f 74 20 6f 66 66  File*, off_t off
15a0: 73 65 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  set);.int sqlite
15b0: 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 2a 29 3b  OsSync(OsFile*);
15c0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54 72 75  .int sqliteOsTru
15d0: 6e 63 61 74 65 28 4f 73 46 69 6c 65 2a 2c 20 6f  ncate(OsFile*, o
15e0: 66 66 5f 74 20 73 69 7a 65 29 3b 0a 69 6e 74 20  ff_t size);.int 
15f0: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
1600: 28 4f 73 46 69 6c 65 2a 2c 20 6f 66 66 5f 74 20  (OsFile*, off_t 
1610: 2a 70 53 69 7a 65 29 3b 0a 69 6e 74 20 73 71 6c  *pSize);.int sql
1620: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 4f 73  iteOsReadLock(Os
1630: 46 69 6c 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  File*);.int sqli
1640: 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28 4f 73  teOsWriteLock(Os
1650: 46 69 6c 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  File*);.int sqli
1660: 74 65 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  teOsUnlock(OsFil
1670: 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f  e*);.int sqliteO
1680: 73 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  sRandomSeed(char
1690: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73  *);.int sqliteOs
16a0: 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 3b 0a 69  Sleep(int ms);.i
16b0: 6e 74 20 73 71 6c 69 74 65 4f 73 43 75 72 72 65  nt sqliteOsCurre
16c0: 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 2a 29 3b  ntTime(double*);
16d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 73 45 6e  .void sqliteOsEn
16e0: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 3b 0a  terMutex(void);.
16f0: 76 6f 69 64 20 73 71 6c 69 74 65 4f 73 4c 65 61  void sqliteOsLea
1700: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 3b 0a 63  veMutex(void);.c
1710: 68 61 72 20 2a 73 71 6c 69 74 65 4f 73 46 75 6c  har *sqliteOsFul
1720: 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20  lPathname(const 
1730: 63 68 61 72 2a 29 3b 0a 0a 0a 0a 23 65 6e 64 69  char*);....#endi
1740: 66 20 2f 2a 20 5f 53 51 4c 49 54 45 5f 4f 53 5f  f /* _SQLITE_OS_
1750: 48 5f 20 2a 2f 0a                                H_ */.