18 removals
43 additions
1./*1./*
2. * Directory utility functions.2. * Directory utility functions.
3. *3. *
4. * Author:4. * Author:
5. * Gonzalo Paniagua Javier (gonzalo@novell.com)5. * Gonzalo Paniagua Javier (gonzalo@novell.com)
6. *6. *
7. * (C) 2006 Novell, Inc.7. * (C) 2006 Novell, Inc.
8. *8. *
9. * Permission is hereby granted, free of charge, to any person obtaining9. * Permission is hereby granted, free of charge, to any person obtaining
10. * a copy of this software and associated documentation files (the10. * a copy of this software and associated documentation files (the
11. * "Software"), to deal in the Software without restriction, including11. * "Software"), to deal in the Software without restriction, including
12. * without limitation the rights to use, copy, modify, merge, publish,12. * without limitation the rights to use, copy, modify, merge, publish,
13. * distribute, sublicense, and/or sell copies of the Software, and to13. * distribute, sublicense, and/or sell copies of the Software, and to
14. * permit persons to whom the Software is furnished to do so, subject to14. * permit persons to whom the Software is furnished to do so, subject to
15. * the following conditions:15. * the following conditions:
16. *16. *
17. * The above copyright notice and this permission notice shall be17. * The above copyright notice and this permission notice shall be
18. * included in all copies or substantial portions of the Software.18. * included in all copies or substantial portions of the Software.
19. *19. *
20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF21. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND22. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE23. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24. * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION24. * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25. * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION25. * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26. * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.26. * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27. */27. */
28.
28.#include <glib.h>29.#include <glib.h>
29.#include <stdio.h>30.#include <stdio.h>
30.#include <stdlib.h>31.#include <stdlib.h>
31.#include <errno.h>32.#include <errno.h>
32.#include <sys/types.h>33.#include <sys/types.h>
33.#include <sys/stat.h>34.#include <sys/stat.h>
34.#include <unistd.h>35.#include <unistd.h>
35.#include <dirent.h>36.//#include <dirent.h>
37.
38.#include <psp2/io/dirent.h>
39.#include <psp2/io/stat.h>
40.
41.#define opendir sceIoDopen
42.#define closedir sceIoDclose
43.#define readdir sceIoDread
44.#define mkdir sceIoMkdir
45.#define DIR SceUID
46.#define dirent SceIoDirent
36.47.
37.struct _GDir {48.struct _GDir {
38. DIR *dir;49. DIR dir;
39.#ifndef HAVE_REWINDDIR50.#ifndef HAVE_REWINDDIR
40. char *path;51. char *path;
41.#endif52.#endif
53. char current[256];
42.};54.};
43.55.
44.GDir *56.GDir *
45.g_dir_open (const gchar *path, guint flags, GError **error)57. g_dir_open (const gchar *path, guint flags, GError **error)
46.{58. {
47. GDir *dir;59. GDir *dir;
48.60.
49. g_return_val_if_fail (path != NULL, NULL);61. g_return_val_if_fail (path != NULL, NULL);
50. g_return_val_if_fail (error == NULL || *error == NULL, NULL);62. g_return_val_if_fail (error == NULL || *error == NULL, NULL);
51.63.
52. (void) flags; /* this is not used */64. (void) flags; /* this is not used */
53. dir = g_new (GDir, 1);65. dir = g_new (GDir, 1);
54. dir->dir = opendir (path);66. dir->dir = opendir (path);
55. if (dir->dir == NULL) {67. if (dir->dir <0) {
56. if (error) {68. if (error) {
57. gint err = errno;69. gint err = dir->dir;
58. *error = g_error_new (G_LOG_DOMAIN, g_file_error_from_errno (err), strerror (err));70. *error = g_error_new (G_LOG_DOMAIN, g_file_error_from_errno (err), strerror (err));
59. }71. }
60. g_free (dir);72. g_free (dir);
61. return NULL;73. return NULL;
62. }74. }
63.#ifndef HAVE_REWINDDIR75.#ifndef HAVE_REWINDDIR
64. dir->path = g_strdup (path);76. dir->path = g_strdup (path);
65.#endif77.#endif
78.
79.
66. return dir;80. return dir;
81.
67.}82.}
68.83.
69.const gchar *84.const gchar *
70.g_dir_read_name (GDir *dir)85.g_dir_read_name (GDir *dir)
71.{86.{
72. struct dirent *entry;87. dirent entry;
88. int r;
89. memset(&entry,0,sizeof(dirent));
90.
73.91.
74. g_return_val_if_fail (dir != NULL && dir->dir != NULL, NULL);92. g_return_val_if_fail (dir != NULL && dir->dir != NULL, NULL);
75. do {93. do {
76. entry = readdir (dir->dir);94. r = readdir (dir->dir,&entry);
77. if (entry == NULL)95. if (r<0)
78. return NULL;96. return NULL;
79. } while ((strcmp (entry->d_name, ".") == 0) || (strcmp (entry->d_name, "..") == 0));97. } while ((strcmp (entry.d_name, ".") == 0) || (strcmp (entry.d_name, "..") == 0));
80.98.
81. return entry->d_name;99. strcpy(dir->current,entry.d_name);
100.
101. return dir->current;
82.}102.}
83.103.
84.void104.void
85.g_dir_rewind (GDir *dir)105.g_dir_rewind (GDir *dir)
86.{106.{
87. g_return_if_fail (dir != NULL && dir->dir != NULL);107. g_return_if_fail (dir != NULL && dir->dir != NULL);
88.#ifndef HAVE_REWINDDIR108.#ifndef HAVE_REWINDDIR
89. closedir (dir->dir);109. closedir (dir->dir);
90. dir->dir = opendir (dir->path);110. dir->dir = opendir (dir->path);
91.#else111.#else
92. rewinddir (dir->dir);112. rewinddir (dir->dir);
93.#endif113.#endif
94.}114.}
95.115.
96.void116.void
97.g_dir_close (GDir *dir)117.g_dir_close (GDir *dir)
98.{118.{
99. g_return_if_fail (dir != NULL && dir->dir != 0);119. g_return_if_fail (dir != NULL && dir->dir != 0);
100. closedir (dir->dir);120. closedir (dir->dir);
101.#ifndef HAVE_REWINDDIR121.#ifndef HAVE_REWINDDIR
102. g_free (dir->path);122. g_free (dir->path);
103.#endif123.#endif
104. dir->dir = NULL;124. dir->dir = NULL;
105. g_free (dir);125. g_free (dir);
106.}126.}
107.127.
108.int128.int
109.g_mkdir_with_parents (const gchar *pathname, int mode)129.g_mkdir_with_parents (const gchar *pathname, int mode)
110.{130.{
111. char *path, *d;131. char *path, *d;
112. int rv;132. int rv;
113. 133.
114. if (!pathname || *pathname == '\0') {134. if (!pathname || *pathname == '\0') {
115. errno = EINVAL;135. errno = EINVAL;
116. return -1;136. return -1;
117. }137. }
118. 138.
119. d = path = g_strdup (pathname);139. d = path = g_strdup (pathname);
120. if (*d == '/')140. if (*d == '/')
121. d++;141. d++;
122. 142.
123. while (TRUE) {143. while (TRUE) {
124. if (*d == '/' || *d == '\0') {144. if (*d == '/' || *d == '\0') {
125. char orig = *d;145. char orig = *d;
126. *d = '\0';146. *d = '\0';
127. rv = mkdir (path, mode);147. rv = mkdir (path, mode);
128. if (rv == -1 && errno != EEXIST) {148. if (rv == -1 && errno != EEXIST) {
129. g_free (path);149. g_free (path);
130. return -1;150. return -1;
131. }151. }
132.152.
133. *d++ = orig;153. *d++ = orig;
134. while (orig == '/' && *d == '/')154. while (orig == '/' && *d == '/')
135. d++;155. d++;
136. if (orig == '\0')156. if (orig == '\0')
137. break;157. break;
138. } else {158. } else {
139. d++;159. d++;
140. }160. }
141. }161. }
142. 162.
143. g_free (path);163. g_free (path);
144. 164.
145. return 0;165. return 0;
146.}166.}
original text
changed text