Mercurial > code
annotate directory.c @ 178:2bfe43b85d7f
Add dates
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 21 Sep 2013 15:08:53 +0200 |
parents | 54976019a5a8 |
children |
rev | line source |
---|---|
150 | 1 /* |
2 * directory.c -- portable way to open directories | |
3 * | |
4 * Copyright (c) 2011, 2012 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 | |
23 #include "directory.h" | |
24 | |
25 #if defined(_WIN32) /* WINDOWS */ | |
26 | |
27 struct directory * | |
28 directory_open(const char *path) | |
29 { | |
30 WIN32_FIND_DATA fdata; | |
31 HANDLE h; | |
32 struct directory *res; | |
33 char respath[FILENAME_MAX + 1]; | |
34 | |
35 if (!(res = calloc(1, sizeof (struct directory)))) | |
36 return NULL; | |
37 | |
38 snprintf(respath, sizeof (respath), "%s/*", path); | |
39 | |
40 if ((h = FindFirstFile(respath, &fdata)) == INVALID_HANDLE_VALUE) { | |
41 free(res); | |
42 return NULL; | |
43 } | |
44 | |
45 do { | |
46 res->ents = realloc(res->ents, | |
47 sizeof (*res->ents) * (res->nents + 1)); | |
48 | |
49 /* Fail to reallocate */ | |
50 if (!res->ents) { | |
51 free(res); | |
52 res = NULL; | |
53 break; | |
54 } | |
55 | |
56 res->ents[res->nents].name = strdup(fdata.cFileName); | |
57 res->ents[res->nents].type = fdata.dwFileAttributes; | |
58 res->ents[res->nents++].length = strlen(fdata.cFileName); | |
59 } while (FindNextFile(h, &fdata) != 0); | |
60 | |
61 return res; | |
62 } | |
63 | |
64 const char * | |
65 directory_error(void) | |
66 { | |
67 static char msg[1024]; | |
68 DWORD num; | |
69 | |
70 num = GetLastError(); | |
71 | |
72 FormatMessage( | |
73 FORMAT_MESSAGE_FROM_SYSTEM | | |
74 FORMAT_MESSAGE_IGNORE_INSERTS, | |
75 NULL, | |
76 num, | |
77 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |
78 msg, | |
79 sizeof (msg), | |
80 NULL | |
81 ); | |
82 | |
83 return msg; | |
84 } | |
85 | |
86 #else /* UNIX */ | |
87 | |
88 # include <errno.h> | |
89 | |
90 struct directory * | |
91 directory_open(const char *path) | |
92 { | |
93 DIR *dp; | |
94 struct dirent *ent; | |
95 struct directory *res; | |
96 | |
97 if (!(res = calloc(1, sizeof (struct directory)))) | |
98 return NULL; | |
99 | |
100 if (!(dp = opendir(path))) { | |
101 free(res); | |
102 return NULL; | |
103 } | |
104 | |
105 while ((ent = readdir(dp))) { | |
106 res->ents = realloc(res->ents, | |
107 sizeof (*res->ents) * (res->nents + 1)); | |
108 | |
109 /* Fail to reallocate */ | |
110 if (!res->ents) { | |
111 free(res); | |
112 res = NULL; | |
113 break; | |
114 } | |
115 | |
116 res->ents[res->nents].name = strdup(ent->d_name); | |
117 res->ents[res->nents].type = ent->d_type; | |
118 res->ents[res->nents++].length = ent->d_namlen; | |
119 } | |
120 | |
121 (void)closedir(dp); | |
122 | |
123 return res; | |
124 } | |
125 | |
126 const char * | |
127 directory_error(void) | |
128 { | |
129 return strerror(errno); | |
130 } | |
131 | |
132 #endif | |
133 | |
134 void | |
135 directory_free(struct directory *dir) | |
136 { | |
137 int i; | |
138 | |
139 for (i = 0; i < dir->nents; ++i) | |
140 free(dir->ents[i].name); | |
141 | |
142 free(dir->ents); | |
143 free(dir); | |
152
54976019a5a8
Fix problem in pack where cv is set with uninitialized btyes
David Demelier <markand@malikania.fr>
parents:
150
diff
changeset
|
144 } |