Added check for Unix specific headers and harmonize with Win32 build.
[pazpar2-moved-to-github.git] / src / dirent.c
1 /* This file is part of Pazpar2.
2    Copyright (C) 2006-2008 Index Data
3
4 Pazpar2 is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20
21 /* almost identical to dirent.c of Zebra. */
22
23 #if HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <ctype.h>
28 #include <assert.h>
29 #ifdef WIN32
30 #include <io.h>
31 #endif
32 #include <string.h>
33 #include <stdlib.h>
34
35 #include "direntz.h"
36
37 #ifdef WIN32
38
39 struct DIR {
40     HANDLE handle;
41     WIN32_FIND_DATA find_data;
42     struct dirent entry;
43 };
44
45 DIR *opendir (const char *name)
46 {
47     char fullName[MAX_PATH+1];
48     DIR *dd = malloc (sizeof(*dd));
49
50     if (!dd)
51         return NULL;
52     strcpy (fullName, name);
53     strcat (fullName, "\\*.*");
54     dd->handle = FindFirstFile(fullName, &dd->find_data);
55     return dd;
56 }
57                                                           
58 struct dirent *readdir (DIR *dd)
59 {
60     if (dd->handle == INVALID_HANDLE_VALUE)
61         return NULL;
62     strcpy (dd->entry.d_name, dd->find_data.cFileName);
63     if (!FindNextFile(dd->handle, &dd->find_data))
64     {
65         FindClose (dd->handle);
66         dd->handle = INVALID_HANDLE_VALUE;
67     }
68     return &dd->entry;
69 }
70
71 void closedir(DIR *dd)
72 {
73     if (dd->handle != INVALID_HANDLE_VALUE)
74         FindClose (dd->handle);
75     if (dd)
76         free (dd);
77 }
78
79 #endif
80
81 /*
82  * Local variables:
83  * c-basic-offset: 4
84  * indent-tabs-mode: nil
85  * End:
86  * vim: shiftwidth=4 tabstop=8 expandtab
87  */
88