/ Hex Artifact Content
Login

Artifact a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 20 4e 6f 76 65 6d  /*.** 2015 Novem
0010: 62 65 72 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65  ber 30.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 6f   to implement mo
01a0: 73 74 20 6f 66 20 74 68 65 20 6f 70 65 6e 64 69  st of the opendi
01b0: 72 28 29 20 66 61 6d 69 6c 79 20 6f 66 0a 2a 2a  r() family of.**
01c0: 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 73   POSIX functions
01d0: 20 6f 6e 20 57 69 6e 33 32 20 75 73 69 6e 67 20   on Win32 using 
01e0: 74 68 65 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a 0a  the MSVCRT..*/..
01f0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
0200: 33 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  32) && defined(_
0210: 4d 53 43 5f 56 45 52 29 0a 23 69 6e 63 6c 75 64  MSC_VER).#includ
0220: 65 20 22 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  e "test_windiren
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  t.h"../*.** Impl
0240: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
0250: 65 20 50 4f 53 49 58 20 67 65 74 65 6e 76 28 29  e POSIX getenv()
0260: 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20   function using 
0270: 74 68 65 20 57 69 6e 33 32 20 41 50 49 2e 0a 2a  the Win32 API..*
0280: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
0290: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  is not thread-sa
02a0: 66 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  fe..*/.const cha
02b0: 72 20 2a 77 69 6e 64 69 72 65 6e 74 5f 67 65 74  r *windirent_get
02c0: 65 6e 76 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  env(.  const cha
02d0: 72 20 2a 6e 61 6d 65 0a 29 7b 0a 20 20 73 74 61  r *name.){.  sta
02e0: 74 69 63 20 63 68 61 72 20 76 61 6c 75 65 5b 33  tic char value[3
02f0: 32 37 36 38 5d 3b 20 2f 2a 20 4d 61 78 69 6d 75  2768]; /* Maximu
0300: 6d 20 6c 65 6e 67 74 68 2c 20 70 65 72 20 4d 53  m length, per MS
0310: 44 4e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  DN */.  DWORD dw
0320: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 76 61  Size = sizeof(va
0330: 6c 75 65 29 20 2f 20 73 69 7a 65 6f 66 28 63 68  lue) / sizeof(ch
0340: 61 72 29 3b 20 2f 2a 20 53 69 7a 65 20 69 6e 20  ar); /* Size in 
0350: 63 68 61 72 73 20 2a 2f 0a 20 20 44 57 4f 52 44  chars */.  DWORD
0360: 20 64 77 52 65 74 3b 20 2f 2a 20 56 61 6c 75 65   dwRet; /* Value
0370: 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
0380: 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
0390: 62 6c 65 41 28 29 20 2a 2f 0a 0a 20 20 6d 65 6d  bleA() */..  mem
03a0: 73 65 74 28 76 61 6c 75 65 2c 20 30 2c 20 73 69  set(value, 0, si
03b0: 7a 65 6f 66 28 76 61 6c 75 65 29 29 3b 0a 20 20  zeof(value));.  
03c0: 64 77 52 65 74 20 3d 20 47 65 74 45 6e 76 69 72  dwRet = GetEnvir
03d0: 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 41 28  onmentVariableA(
03e0: 6e 61 6d 65 2c 20 76 61 6c 75 65 2c 20 64 77 53  name, value, dwS
03f0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 64 77 52 65  ize);.  if( dwRe
0400: 74 3d 3d 30 20 7c 7c 20 64 77 52 65 74 3e 64 77  t==0 || dwRet>dw
0410: 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Size ){.    /*. 
0420: 20 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69     ** The functi
0430: 6f 6e 20 63 61 6c 6c 20 74 6f 20 47 65 74 45 6e  on call to GetEn
0440: 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
0450: 65 41 28 29 20 66 61 69 6c 65 64 20 2d 4f 52 2d  eA() failed -OR-
0460: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 75 66 66  .    ** the buff
0470: 65 72 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20  er is not large 
0480: 65 6e 6f 75 67 68 2e 20 20 45 69 74 68 65 72 20  enough.  Either 
0490: 77 61 79 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  way, return NULL
04a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
04b0: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
04c0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
04d0: 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
04e0: 74 6f 20 47 65 74 45 6e 76 69 72 6f 6e 6d 65 6e  to GetEnvironmen
04f0: 74 56 61 72 69 61 62 6c 65 41 28 29 20 73 75 63  tVariableA() suc
0500: 63 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 2d 41  ceeded.    ** -A
0510: 4e 44 2d 20 74 68 65 20 62 75 66 66 65 72 20 63  ND- the buffer c
0520: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 69  ontains the enti
0530: 72 65 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  re value..    */
0540: 0a 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c 75  .    return valu
0550: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
0560: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0570: 66 20 74 68 65 20 50 4f 53 49 58 20 6f 70 65 6e  f the POSIX open
0580: 64 69 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 75  dir() function u
0590: 73 69 6e 67 20 74 68 65 20 4d 53 56 43 52 54 2e  sing the MSVCRT.
05a0: 0a 2a 2f 0a 4c 50 44 49 52 20 6f 70 65 6e 64 69  .*/.LPDIR opendi
05b0: 72 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r(.  const char 
05c0: 2a 64 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 73 74  *dirname.){.  st
05d0: 72 75 63 74 20 5f 66 69 6e 64 64 61 74 61 5f 74  ruct _finddata_t
05e0: 20 64 61 74 61 3b 0a 20 20 4c 50 44 49 52 20 64   data;.  LPDIR d
05f0: 69 72 70 20 3d 20 28 4c 50 44 49 52 29 73 71 6c  irp = (LPDIR)sql
0600: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
0610: 6f 66 28 44 49 52 29 29 3b 0a 20 20 53 49 5a 45  of(DIR));.  SIZE
0620: 5f 54 20 6e 61 6d 65 73 69 7a 65 20 3d 20 73 69  _T namesize = si
0630: 7a 65 6f 66 28 64 61 74 61 2e 6e 61 6d 65 29 20  zeof(data.name) 
0640: 2f 20 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e 61  / sizeof(data.na
0650: 6d 65 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20 64  me[0]);..  if( d
0660: 69 72 70 3d 3d 4e 55 4c 4c 20 29 20 72 65 74 75  irp==NULL ) retu
0670: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 6d 65 6d 73 65  rn NULL;.  memse
0680: 74 28 64 69 72 70 2c 20 30 2c 20 73 69 7a 65 6f  t(dirp, 0, sizeo
0690: 66 28 44 49 52 29 29 3b 0a 0a 20 20 2f 2a 20 54  f(DIR));..  /* T
06a0: 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
06b0: 20 69 66 20 55 6e 69 78 2d 73 74 79 6c 65 20 72   if Unix-style r
06c0: 6f 6f 74 20 70 61 74 68 73 20 61 72 65 20 6e 6f  oot paths are no
06d0: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 69 66 28  t used. */.  if(
06e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
06f0: 28 64 69 72 6e 61 6d 65 2c 20 22 2f 22 29 3d 3d  (dirname, "/")==
0700: 30 20 29 7b 0a 20 20 20 20 64 69 72 6e 61 6d 65  0 ){.    dirname
0710: 20 3d 20 77 69 6e 64 69 72 65 6e 74 5f 67 65 74   = windirent_get
0720: 65 6e 76 28 22 53 79 73 74 65 6d 44 72 69 76 65  env("SystemDrive
0730: 22 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65  ");.  }..  memse
0740: 74 28 26 64 61 74 61 2c 20 30 2c 20 73 69 7a 65  t(&data, 0, size
0750: 6f 66 28 73 74 72 75 63 74 20 5f 66 69 6e 64 64  of(struct _findd
0760: 61 74 61 5f 74 29 29 3b 0a 20 20 5f 73 6e 70 72  ata_t));.  _snpr
0770: 69 6e 74 66 28 64 61 74 61 2e 6e 61 6d 65 2c 20  intf(data.name, 
0780: 6e 61 6d 65 73 69 7a 65 2c 20 22 25 73 5c 5c 2a  namesize, "%s\\*
0790: 22 2c 20 64 69 72 6e 61 6d 65 29 3b 0a 20 20 64  ", dirname);.  d
07a0: 69 72 70 2d 3e 64 5f 68 61 6e 64 6c 65 20 3d 20  irp->d_handle = 
07b0: 5f 66 69 6e 64 66 69 72 73 74 28 64 61 74 61 2e  _findfirst(data.
07c0: 6e 61 6d 65 2c 20 26 64 61 74 61 29 3b 0a 0a 20  name, &data);.. 
07d0: 20 69 66 28 20 64 69 72 70 2d 3e 64 5f 68 61 6e   if( dirp->d_han
07e0: 64 6c 65 3d 3d 42 41 44 5f 49 4e 54 50 54 52 5f  dle==BAD_INTPTR_
07f0: 54 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 64 69  T ){.    closedi
0800: 72 28 64 69 72 70 29 3b 0a 20 20 20 20 72 65 74  r(dirp);.    ret
0810: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  urn NULL;.  }.. 
0820: 20 2f 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f 76 65   /* TODO: Remove
0830: 20 74 68 69 73 20 62 6c 6f 63 6b 20 74 6f 20 61   this block to a
0840: 6c 6c 6f 77 20 68 69 64 64 65 6e 20 61 6e 64 2f  llow hidden and/
0850: 6f 72 20 73 79 73 74 65 6d 20 66 69 6c 65 73 2e  or system files.
0860: 20 2a 2f 0a 20 20 69 66 28 20 69 73 5f 66 69 6c   */.  if( is_fil
0870: 74 65 72 65 64 28 64 61 74 61 29 20 29 7b 0a 6e  tered(data) ){.n
0880: 65 78 74 3a 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ext:..    memset
0890: 28 26 64 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  (&data, 0, sizeo
08a0: 66 28 73 74 72 75 63 74 20 5f 66 69 6e 64 64 61  f(struct _findda
08b0: 74 61 5f 74 29 29 3b 0a 20 20 20 20 69 66 28 20  ta_t));.    if( 
08c0: 5f 66 69 6e 64 6e 65 78 74 28 64 69 72 70 2d 3e  _findnext(dirp->
08d0: 64 5f 68 61 6e 64 6c 65 2c 20 26 64 61 74 61 29  d_handle, &data)
08e0: 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 63 6c  ==-1 ){.      cl
08f0: 6f 73 65 64 69 72 28 64 69 72 70 29 3b 0a 20 20  osedir(dirp);.  
0900: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
0910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
0920: 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
0930: 20 62 6c 6f 63 6b 20 74 6f 20 61 6c 6c 6f 77 20   block to allow 
0940: 68 69 64 64 65 6e 20 61 6e 64 2f 6f 72 20 73 79  hidden and/or sy
0950: 73 74 65 6d 20 66 69 6c 65 73 2e 20 2a 2f 0a 20  stem files. */. 
0960: 20 20 20 69 66 28 20 69 73 5f 66 69 6c 74 65 72     if( is_filter
0970: 65 64 28 64 61 74 61 29 20 29 20 67 6f 74 6f 20  ed(data) ) goto 
0980: 6e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 64 69 72  next;.  }..  dir
0990: 70 2d 3e 64 5f 66 69 72 73 74 2e 64 5f 61 74 74  p->d_first.d_att
09a0: 72 69 62 75 74 65 73 20 3d 20 64 61 74 61 2e 61  ributes = data.a
09b0: 74 74 72 69 62 3b 0a 20 20 73 74 72 6e 63 70 79  ttrib;.  strncpy
09c0: 28 64 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e 64  (dirp->d_first.d
09d0: 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e 61 6d 65  _name, data.name
09e0: 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a 20 20 64  , NAME_MAX);.  d
09f0: 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e 64 5f 6e  irp->d_first.d_n
0a00: 61 6d 65 5b 4e 41 4d 45 5f 4d 41 58 5d 20 3d 20  ame[NAME_MAX] = 
0a10: 27 5c 30 27 3b 0a 0a 20 20 72 65 74 75 72 6e 20  '\0';..  return 
0a20: 64 69 72 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  dirp;.}../*.** I
0a30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0a40: 20 74 68 65 20 50 4f 53 49 58 20 72 65 61 64 64   the POSIX readd
0a50: 69 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 75 73  ir() function us
0a60: 69 6e 67 20 74 68 65 20 4d 53 56 43 52 54 2e 0a  ing the MSVCRT..
0a70: 2a 2f 0a 4c 50 44 49 52 45 4e 54 20 72 65 61 64  */.LPDIRENT read
0a80: 64 69 72 28 0a 20 20 4c 50 44 49 52 20 64 69 72  dir(.  LPDIR dir
0a90: 70 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 5f 66  p.){.  struct _f
0aa0: 69 6e 64 64 61 74 61 5f 74 20 64 61 74 61 3b 0a  inddata_t data;.
0ab0: 0a 20 20 69 66 28 20 64 69 72 70 3d 3d 4e 55 4c  .  if( dirp==NUL
0ac0: 4c 20 29 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  L ) return NULL;
0ad0: 0a 0a 20 20 69 66 28 20 64 69 72 70 2d 3e 64 5f  ..  if( dirp->d_
0ae0: 66 69 72 73 74 2e 64 5f 69 6e 6f 3d 3d 30 20 29  first.d_ino==0 )
0af0: 7b 0a 20 20 20 20 64 69 72 70 2d 3e 64 5f 66 69  {.    dirp->d_fi
0b00: 72 73 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a 20 20 20  rst.d_ino++;.   
0b10: 20 64 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64 5f   dirp->d_next.d_
0b20: 69 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 72 65 74 75  ino++;..    retu
0b30: 72 6e 20 26 64 69 72 70 2d 3e 64 5f 66 69 72 73  rn &dirp->d_firs
0b40: 74 3b 0a 20 20 7d 0a 0a 6e 65 78 74 3a 0a 0a 20  t;.  }..next:.. 
0b50: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 2c 20 30   memset(&data, 0
0b60: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
0b70: 5f 66 69 6e 64 64 61 74 61 5f 74 29 29 3b 0a 20  _finddata_t));. 
0b80: 20 69 66 28 20 5f 66 69 6e 64 6e 65 78 74 28 64   if( _findnext(d
0b90: 69 72 70 2d 3e 64 5f 68 61 6e 64 6c 65 2c 20 26  irp->d_handle, &
0ba0: 64 61 74 61 29 3d 3d 2d 31 20 29 20 72 65 74 75  data)==-1 ) retu
0bb0: 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 54  rn NULL;..  /* T
0bc0: 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
0bd0: 20 62 6c 6f 63 6b 20 74 6f 20 61 6c 6c 6f 77 20   block to allow 
0be0: 68 69 64 64 65 6e 20 61 6e 64 2f 6f 72 20 73 79  hidden and/or sy
0bf0: 73 74 65 6d 20 66 69 6c 65 73 2e 20 2a 2f 0a 20  stem files. */. 
0c00: 20 69 66 28 20 69 73 5f 66 69 6c 74 65 72 65 64   if( is_filtered
0c10: 28 64 61 74 61 29 20 29 20 67 6f 74 6f 20 6e 65  (data) ) goto ne
0c20: 78 74 3b 0a 0a 20 20 64 69 72 70 2d 3e 64 5f 6e  xt;..  dirp->d_n
0c30: 65 78 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a 20 20 64  ext.d_ino++;.  d
0c40: 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64 5f 61 74  irp->d_next.d_at
0c50: 74 72 69 62 75 74 65 73 20 3d 20 64 61 74 61 2e  tributes = data.
0c60: 61 74 74 72 69 62 3b 0a 20 20 73 74 72 6e 63 70  attrib;.  strncp
0c70: 79 28 64 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64  y(dirp->d_next.d
0c80: 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e 61 6d 65  _name, data.name
0c90: 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a 20 20 64  , NAME_MAX);.  d
0ca0: 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64 5f 6e 61  irp->d_next.d_na
0cb0: 6d 65 5b 4e 41 4d 45 5f 4d 41 58 5d 20 3d 20 27  me[NAME_MAX] = '
0cc0: 5c 30 27 3b 0a 0a 20 20 72 65 74 75 72 6e 20 26  \0';..  return &
0cd0: 64 69 72 70 2d 3e 64 5f 6e 65 78 74 3b 0a 7d 0a  dirp->d_next;.}.
0ce0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
0cf0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 4f 53  ation of the POS
0d00: 49 58 20 72 65 61 64 64 69 72 5f 72 28 29 20 66  IX readdir_r() f
0d10: 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  unction using th
0d20: 65 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a 49 4e 54  e MSVCRT..*/.INT
0d30: 20 72 65 61 64 64 69 72 5f 72 28 0a 20 20 4c 50   readdir_r(.  LP
0d40: 44 49 52 20 64 69 72 70 2c 0a 20 20 4c 50 44 49  DIR dirp,.  LPDI
0d50: 52 45 4e 54 20 65 6e 74 72 79 2c 0a 20 20 4c 50  RENT entry,.  LP
0d60: 44 49 52 45 4e 54 20 2a 72 65 73 75 6c 74 0a 29  DIRENT *result.)
0d70: 7b 0a 20 20 73 74 72 75 63 74 20 5f 66 69 6e 64  {.  struct _find
0d80: 64 61 74 61 5f 74 20 64 61 74 61 3b 0a 0a 20 20  data_t data;..  
0d90: 69 66 28 20 64 69 72 70 3d 3d 4e 55 4c 4c 20 29  if( dirp==NULL )
0da0: 20 72 65 74 75 72 6e 20 45 42 41 44 46 3b 0a 0a   return EBADF;..
0db0: 20 20 69 66 28 20 64 69 72 70 2d 3e 64 5f 66 69    if( dirp->d_fi
0dc0: 72 73 74 2e 64 5f 69 6e 6f 3d 3d 30 20 29 7b 0a  rst.d_ino==0 ){.
0dd0: 20 20 20 20 64 69 72 70 2d 3e 64 5f 66 69 72 73      dirp->d_firs
0de0: 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a 20 20 20 20 64  t.d_ino++;.    d
0df0: 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64 5f 69 6e  irp->d_next.d_in
0e00: 6f 2b 2b 3b 0a 0a 20 20 20 20 65 6e 74 72 79 2d  o++;..    entry-
0e10: 3e 64 5f 69 6e 6f 20 3d 20 64 69 72 70 2d 3e 64  >d_ino = dirp->d
0e20: 5f 66 69 72 73 74 2e 64 5f 69 6e 6f 3b 0a 20 20  _first.d_ino;.  
0e30: 20 20 65 6e 74 72 79 2d 3e 64 5f 61 74 74 72 69    entry->d_attri
0e40: 62 75 74 65 73 20 3d 20 64 69 72 70 2d 3e 64 5f  butes = dirp->d_
0e50: 66 69 72 73 74 2e 64 5f 61 74 74 72 69 62 75 74  first.d_attribut
0e60: 65 73 3b 0a 20 20 20 20 73 74 72 6e 63 70 79 28  es;.    strncpy(
0e70: 65 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 2c 20 64  entry->d_name, d
0e80: 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e 64 5f 6e  irp->d_first.d_n
0e90: 61 6d 65 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a  ame, NAME_MAX);.
0ea0: 20 20 20 20 65 6e 74 72 79 2d 3e 64 5f 6e 61 6d      entry->d_nam
0eb0: 65 5b 4e 41 4d 45 5f 4d 41 58 5d 20 3d 20 27 5c  e[NAME_MAX] = '\
0ec0: 30 27 3b 0a 0a 20 20 20 20 2a 72 65 73 75 6c 74  0';..    *result
0ed0: 20 3d 20 65 6e 74 72 79 3b 0a 20 20 20 20 72 65   = entry;.    re
0ee0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 6e 65 78  turn 0;.  }..nex
0ef0: 74 3a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  t:..  memset(&da
0f00: 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74  ta, 0, sizeof(st
0f10: 72 75 63 74 20 5f 66 69 6e 64 64 61 74 61 5f 74  ruct _finddata_t
0f20: 29 29 3b 0a 20 20 69 66 28 20 5f 66 69 6e 64 6e  ));.  if( _findn
0f30: 65 78 74 28 64 69 72 70 2d 3e 64 5f 68 61 6e 64  ext(dirp->d_hand
0f40: 6c 65 2c 20 26 64 61 74 61 29 3d 3d 2d 31 20 29  le, &data)==-1 )
0f50: 7b 0a 20 20 20 20 2a 72 65 73 75 6c 74 20 3d 20  {.    *result = 
0f60: 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NULL;.    return
0f70: 20 45 4e 4f 45 4e 54 3b 0a 20 20 7d 0a 0a 20 20   ENOENT;.  }..  
0f80: 2f 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20  /* TODO: Remove 
0f90: 74 68 69 73 20 62 6c 6f 63 6b 20 74 6f 20 61 6c  this block to al
0fa0: 6c 6f 77 20 68 69 64 64 65 6e 20 61 6e 64 2f 6f  low hidden and/o
0fb0: 72 20 73 79 73 74 65 6d 20 66 69 6c 65 73 2e 20  r system files. 
0fc0: 2a 2f 0a 20 20 69 66 28 20 69 73 5f 66 69 6c 74  */.  if( is_filt
0fd0: 65 72 65 64 28 64 61 74 61 29 20 29 20 67 6f 74  ered(data) ) got
0fe0: 6f 20 6e 65 78 74 3b 0a 0a 20 20 65 6e 74 72 79  o next;..  entry
0ff0: 2d 3e 64 5f 69 6e 6f 20 3d 20 28 69 6e 6f 5f 74  ->d_ino = (ino_t
1000: 29 2d 31 3b 20 2f 2a 20 6e 6f 74 20 61 76 61 69  )-1; /* not avai
1010: 6c 61 62 6c 65 20 2a 2f 0a 20 20 65 6e 74 72 79  lable */.  entry
1020: 2d 3e 64 5f 61 74 74 72 69 62 75 74 65 73 20 3d  ->d_attributes =
1030: 20 64 61 74 61 2e 61 74 74 72 69 62 3b 0a 20 20   data.attrib;.  
1040: 73 74 72 6e 63 70 79 28 65 6e 74 72 79 2d 3e 64  strncpy(entry->d
1050: 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e 61 6d 65  _name, data.name
1060: 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a 20 20 65  , NAME_MAX);.  e
1070: 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b 4e 41 4d  ntry->d_name[NAM
1080: 45 5f 4d 41 58 5d 20 3d 20 27 5c 30 27 3b 0a 0a  E_MAX] = '\0';..
1090: 20 20 2a 72 65 73 75 6c 74 20 3d 20 65 6e 74 72    *result = entr
10a0: 79 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  y;.  return 0;.}
10b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
10c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 4f  tation of the PO
10d0: 53 49 58 20 63 6c 6f 73 65 64 69 72 28 29 20 66  SIX closedir() f
10e0: 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  unction using th
10f0: 65 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a 49 4e 54  e MSVCRT..*/.INT
1100: 20 63 6c 6f 73 65 64 69 72 28 0a 20 20 4c 50 44   closedir(.  LPD
1110: 49 52 20 64 69 72 70 0a 29 7b 0a 20 20 49 4e 54  IR dirp.){.  INT
1120: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 0a 20 20   result = 0;..  
1130: 69 66 28 20 64 69 72 70 3d 3d 4e 55 4c 4c 20 29  if( dirp==NULL )
1140: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a   return EINVAL;.
1150: 0a 20 20 69 66 28 20 64 69 72 70 2d 3e 64 5f 68  .  if( dirp->d_h
1160: 61 6e 64 6c 65 21 3d 4e 55 4c 4c 5f 49 4e 54 50  andle!=NULL_INTP
1170: 54 52 5f 54 20 26 26 20 64 69 72 70 2d 3e 64 5f  TR_T && dirp->d_
1180: 68 61 6e 64 6c 65 21 3d 42 41 44 5f 49 4e 54 50  handle!=BAD_INTP
1190: 54 52 5f 54 20 29 7b 0a 20 20 20 20 72 65 73 75  TR_T ){.    resu
11a0: 6c 74 20 3d 20 5f 66 69 6e 64 63 6c 6f 73 65 28  lt = _findclose(
11b0: 64 69 72 70 2d 3e 64 5f 68 61 6e 64 6c 65 29 3b  dirp->d_handle);
11c0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
11d0: 66 72 65 65 28 64 69 72 70 29 3b 0a 20 20 72 65  free(dirp);.  re
11e0: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a  turn result;.}..
11f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1200: 64 28 57 49 4e 33 32 29 20 26 26 20 64 65 66 69  d(WIN32) && defi
1210: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 2a 2f  ned(_MSC_VER) */
1220: 0a                                               .