1 /***********************************************************************
2 * Copyright (c) 2009, Secure Endpoints Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
30 **********************************************************************/
43 #error Only implemented for Win32
46 struct _dirent_dirinfo
{
51 struct dirent
**entries
;
53 #define DIRINFO_MAGIC 0xf8c0639d
54 #define IS_DP(p) ((p) && ((DIR *)(p))->magic == DIRINFO_MAGIC)
56 #define INITIAL_ENTRIES 16
58 ROKEN_LIB_FUNCTION
DIR * ROKEN_LIB_CALL
59 opendir(const char * filespec
)
62 struct _finddata_t fd
;
65 memset(&fd
, 0, sizeof(fd
));
67 fd_handle
= _findfirst(filespec
, &fd
);
72 dp
= malloc(sizeof(*dp
));
76 memset(dp
, 0, sizeof(*dp
));
77 dp
->magic
= DIRINFO_MAGIC
;
80 dp
->nc_entries
= INITIAL_ENTRIES
;
81 dp
->entries
= calloc(dp
->nc_entries
, sizeof(dp
->entries
[0]));
83 if (dp
->entries
== NULL
) {
90 size_t len
= strlen(fd
.name
);
93 if (dp
->n_entries
== dp
->nc_entries
) {
97 ne
= realloc(dp
->entries
, sizeof(dp
->entries
[0]) * dp
->nc_entries
);
108 e
= malloc(sizeof(*e
) + len
* sizeof(char));
115 e
->d_ino
= 0; /* no inodes :( */
116 strcpy_s(e
->d_name
, len
+ 1, fd
.name
);
118 dp
->entries
[dp
->n_entries
++] = e
;
120 } while (_findnext(fd_handle
, &fd
) == 0);
124 _findclose(fd_handle
);
129 ROKEN_LIB_FUNCTION
int ROKEN_LIB_CALL
138 for (i
=0; i
< dp
->n_entries
; i
++) {
139 free(dp
->entries
[i
]);
150 ROKEN_LIB_FUNCTION
struct dirent
* ROKEN_LIB_CALL
155 dp
->cursor
>= dp
->n_entries
)
159 return dp
->entries
[dp
->cursor
++];
162 ROKEN_LIB_FUNCTION
void ROKEN_LIB_CALL
169 ROKEN_LIB_FUNCTION
void ROKEN_LIB_CALL
170 seekdir(DIR * dp
, long offset
)
172 if (IS_DP(dp
) && offset
>= 0 && offset
< dp
->n_entries
)
176 ROKEN_LIB_FUNCTION
long ROKEN_LIB_CALL