| /* | | /* |
| * Directory utility functions. | | * Directory utility functions. |
| * | | * |
| * Author: | | * Author: |
| * Gonzalo Paniagua Javier (gonzalo@novell.com) | | * Gonzalo Paniagua Javier (gonzalo@novell.com) |
| * | | * |
| * (C) 2006 Novell, Inc. | | * (C) 2006 Novell, Inc. |
| * | | * |
| * Permission is hereby granted, free of charge, to any person obtaining | | * Permission is hereby granted, free of charge, to any person obtaining |
| * a copy of this software and associated documentation files (the | | * a copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including | | * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, | | * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sublicense, and/or sell copies of the Software, and to | | * distribute, sublicense, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to | | * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: | | * the following conditions: |
| * | | * |
| * The above copyright notice and this permission notice shall be | | * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. | | * included in all copies or substantial portions of the Software. |
| * | | * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | | * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ | | */ |
| | | |
| #include <glib.h> | | #include <glib.h> |
| #include <stdio.h> | | #include <stdio.h> |
| #include <stdlib.h> | | #include <stdlib.h> |
| #include <errno.h> | | #include <errno.h> |
| #include <sys/types.h> | | #include <sys/types.h> |
| #include <sys/stat.h> | | #include <sys/stat.h> |
| #include <unistd.h> | | #include <unistd.h> |
| #include <dirent.h> | | //#include <dirent.h> |
| | | |
| | | #include <psp2/io/dirent.h> |
| | | #include <psp2/io/stat.h> |
| | | |
| | | #define opendir sceIoDopen |
| | | #define closedir sceIoDclose |
| | | #define readdir sceIoDread |
| | | #define mkdir sceIoMkdir |
| | | #define DIR SceUID |
| | | #define dirent SceIoDirent |
| | | |
| struct _GDir { | | struct _GDir { |
| DIR *dir; | | DIR dir; |
| #ifndef HAVE_REWINDDIR | | #ifndef HAVE_REWINDDIR |
| char *path; | | char *path; |
| #endif | | #endif |
| | | char current[256]; |
| }; | | }; |
| | | |
| GDir * | | GDir * |
| g_dir_open (const gchar *path, guint flags, GError **error) | | g_dir_open (const gchar *path, guint flags, GError **error) |
| { | | { |
| GDir *dir; | | GDir *dir; |
| | | |
| g_return_val_if_fail (path != NULL, NULL); | | g_return_val_if_fail (path != NULL, NULL); |
| g_return_val_if_fail (error == NULL || *error == NULL, NULL); | | g_return_val_if_fail (error == NULL || *error == NULL, NULL); |
| | | |
| (void) flags; /* this is not used */ | | (void) flags; /* this is not used */ |
| dir = g_new (GDir, 1); | | dir = g_new (GDir, 1); |
| dir->dir = opendir (path); | | dir->dir = opendir (path); |
| if (dir->dir == NULL) { | | if (dir->dir <0) { |
| if (error) { | | if (error) { |
| gint err = errno; | | gint err = dir->dir; |
| *error = g_error_new (G_LOG_DOMAIN, g_file_error_from_errno (err), strerror (err)); | | *error = g_error_new (G_LOG_DOMAIN, g_file_error_from_errno (err), strerror (err)); |
| } | | } |
| g_free (dir); | | g_free (dir); |
| return NULL; | | return NULL; |
| } | | } |
| #ifndef HAVE_REWINDDIR | | #ifndef HAVE_REWINDDIR |
| dir->path = g_strdup (path); | | dir->path = g_strdup (path); |
| #endif | | #endif |
| | | |
| | | |
| return dir; | | return dir; |
| | | |
| } | | } |
| | | |
| const gchar * | | const gchar * |
| g_dir_read_name (GDir *dir) | | g_dir_read_name (GDir *dir) |
| { | | { |
| struct dirent *entry; | | dirent entry; |
| | | int r; |
| | | memset(&entry,0,sizeof(dirent)); |
| | | |
| | | |
| g_return_val_if_fail (dir != NULL && dir->dir != NULL, NULL); | | g_return_val_if_fail (dir != NULL && dir->dir != NULL, NULL); |
| do { | | do { |
| entry = readdir (dir->dir); | | r = readdir (dir->dir,&entry); |
| if (entry == NULL) | | if (r<0) |
| return NULL; | | return NULL; |
| } while ((strcmp (entry->d_name, ".") == 0) || (strcmp (entry->d_name, "..") == 0)); | | } while ((strcmp (entry.d_name, ".") == 0) || (strcmp (entry.d_name, "..") == 0)); |
| | | |
| return entry->d_name; | | strcpy(dir->current,entry.d_name); |
| | | |
| | | return dir->current; |
| } | | } |
| | | |
| void | | void |
| g_dir_rewind (GDir *dir) | | g_dir_rewind (GDir *dir) |
| { | | { |
| g_return_if_fail (dir != NULL && dir->dir != NULL); | | g_return_if_fail (dir != NULL && dir->dir != NULL); |
| #ifndef HAVE_REWINDDIR | | #ifndef HAVE_REWINDDIR |
| closedir (dir->dir); | | closedir (dir->dir); |
| dir->dir = opendir (dir->path); | | dir->dir = opendir (dir->path); |
| #else | | #else |
| rewinddir (dir->dir); | | rewinddir (dir->dir); |
| #endif | | #endif |
| } | | } |
| | | |
| void | | void |
| g_dir_close (GDir *dir) | | g_dir_close (GDir *dir) |
| { | | { |
| g_return_if_fail (dir != NULL && dir->dir != 0); | | g_return_if_fail (dir != NULL && dir->dir != 0); |
| closedir (dir->dir); | | closedir (dir->dir); |
| #ifndef HAVE_REWINDDIR | | #ifndef HAVE_REWINDDIR |
| g_free (dir->path); | | g_free (dir->path); |
| #endif | | #endif |
| dir->dir = NULL; | | dir->dir = NULL; |
| g_free (dir); | | g_free (dir); |
| } | | } |
| | | |
| int | | int |
| g_mkdir_with_parents (const gchar *pathname, int mode) | | g_mkdir_with_parents (const gchar *pathname, int mode) |
| { | | { |
| char *path, *d; | | char *path, *d; |
| int rv; | | int rv; |
| | | |
| if (!pathname || *pathname == '\0') { | | if (!pathname || *pathname == '\0') { |
| errno = EINVAL; | | errno = EINVAL; |
| return -1; | | return -1; |
| } | | } |
| | | |
| d = path = g_strdup (pathname); | | d = path = g_strdup (pathname); |
| if (*d == '/') | | if (*d == '/') |
| d++; | | d++; |
| | | |
| while (TRUE) { | | while (TRUE) { |
| if (*d == '/' || *d == '\0') { | | if (*d == '/' || *d == '\0') { |
| char orig = *d; | | char orig = *d; |
| *d = '\0'; | | *d = '\0'; |
| rv = mkdir (path, mode); | | rv = mkdir (path, mode); |
| if (rv == -1 && errno != EEXIST) { | | if (rv == -1 && errno != EEXIST) { |
| g_free (path); | | g_free (path); |
| return -1; | | return -1; |
| } | | } |
| | | |
| *d++ = orig; | | *d++ = orig; |
| while (orig == '/' && *d == '/') | | while (orig == '/' && *d == '/') |
| d++; | | d++; |
| if (orig == '\0') | | if (orig == '\0') |
| break; | | break; |
| } else { | | } else { |
| d++; | | d++; |
| } | | } |
| } | | } |
| | | |
| g_free (path); | | g_free (path); |
| | | |
| return 0; | | return 0; |
| } | | } |
| | | |