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 obtaining | 9. | * Permission is hereby granted, free of charge, to any person obtaining |
10. | * a copy of this software and associated documentation files (the | 10. | * a copy of this software and associated documentation files (the |
11. | * "Software"), to deal in the Software without restriction, including | 11. | * "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 to | 13. | * distribute, sublicense, and/or sell copies of the Software, and to |
14. | * permit persons to whom the Software is furnished to do so, subject to | 14. | * 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 be | 17. | * 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 OF | 21. | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
22. | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 22. | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
23. | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | 23. | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
24. | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 24. | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
25. | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 25. | * 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_REWINDDIR | 50. | #ifndef HAVE_REWINDDIR |
40. | char *path; | 51. | char *path; |
41. | #endif | 52. | #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_REWINDDIR | 75. | #ifndef HAVE_REWINDDIR |
64. | dir->path = g_strdup (path); | 76. | dir->path = g_strdup (path); |
65. | #endif | 77. | #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. | void | 104. | 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_REWINDDIR | 108. | #ifndef HAVE_REWINDDIR |
89. | closedir (dir->dir); | 109. | closedir (dir->dir); |
90. | dir->dir = opendir (dir->path); | 110. | dir->dir = opendir (dir->path); |
91. | #else | 111. | #else |
92. | rewinddir (dir->dir); | 112. | rewinddir (dir->dir); |
93. | #endif | 113. | #endif |
94. | } | 114. | } |
95. | | 115. | |
96. | void | 116. | 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_REWINDDIR | 121. | #ifndef HAVE_REWINDDIR |
102. | g_free (dir->path); | 122. | g_free (dir->path); |
103. | #endif | 123. | #endif |
104. | dir->dir = NULL; | 124. | dir->dir = NULL; |
105. | g_free (dir); | 125. | g_free (dir); |
106. | } | 126. | } |
107. | | 127. | |
108. | int | 128. | 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. | } |