annotate directory.c @ 162:3e63d94b495f

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