]> git.proxmox.com Git - libgit2.git/blob - src/win32/dir.c
Cleanup legal data
[libgit2.git] / src / win32 / dir.c
1 /*
2 * Copyright (C) 2009-2011 the libgit2 contributors
3 *
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
6 */
7 #define GIT__WIN32_NO_WRAP_DIR
8 #include "dir.h"
9
10 static int init_filter(char *filter, size_t n, const char *dir)
11 {
12 size_t len = strlen(dir);
13
14 if (len+3 >= n)
15 return 0;
16
17 strcpy(filter, dir);
18 if (len && dir[len-1] != '/')
19 strcat(filter, "/");
20 strcat(filter, "*");
21
22 return 1;
23 }
24
25 git__DIR *git__opendir(const char *dir)
26 {
27 char filter[4096];
28 git__DIR *new;
29
30 if (!dir || !init_filter(filter, sizeof(filter), dir))
31 return NULL;
32
33 new = git__malloc(sizeof(*new));
34 if (!new)
35 return NULL;
36
37 new->dir = git__malloc(strlen(dir)+1);
38 if (!new->dir) {
39 free(new);
40 return NULL;
41 }
42 strcpy(new->dir, dir);
43
44 new->h = FindFirstFile(filter, &new->f);
45 if (new->h == INVALID_HANDLE_VALUE) {
46 free(new->dir);
47 free(new);
48 return NULL;
49 }
50 new->first = 1;
51
52 return new;
53 }
54
55 struct git__dirent *git__readdir(git__DIR *d)
56 {
57 if (!d || d->h == INVALID_HANDLE_VALUE)
58 return NULL;
59
60 if (d->first)
61 d->first = 0;
62 else {
63 if (!FindNextFile(d->h, &d->f))
64 return NULL;
65 }
66
67 if (strlen(d->f.cFileName) >= sizeof(d->entry.d_name))
68 return NULL;
69
70 d->entry.d_ino = 0;
71 strcpy(d->entry.d_name, d->f.cFileName);
72
73 return &d->entry;
74 }
75
76 void git__rewinddir(git__DIR *d)
77 {
78 char filter[4096];
79
80 if (d) {
81 if (d->h != INVALID_HANDLE_VALUE)
82 FindClose(d->h);
83 d->h = INVALID_HANDLE_VALUE;
84 d->first = 0;
85 if (init_filter(filter, sizeof(filter), d->dir)) {
86 d->h = FindFirstFile(filter, &d->f);
87 if (d->h != INVALID_HANDLE_VALUE)
88 d->first = 1;
89 }
90 }
91 }
92
93 int git__closedir(git__DIR *d)
94 {
95 if (d) {
96 if (d->h != INVALID_HANDLE_VALUE)
97 FindClose(d->h);
98 if (d->dir)
99 free(d->dir);
100 free(d);
101 }
102 return 0;
103 }
104