diff options
author | Gianluca Guida <glguida@gmail.com> | 2005-01-31 12:30:05 +0000 |
---|---|---|
committer | Gianluca Guida <glguida@gmail.com> | 2005-01-31 12:30:05 +0000 |
commit | 11a61b22dd0a0a0cc80b3c8594c85fecbb5e679a (patch) | |
tree | 82cddf3ab47f4284db20a9d7e4de84494360f55d /lib.c | |
parent | ff7f04b7b3db282cba72ed16d9128a6b03816399 (diff) |
Added basic stowfs functionalities.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 137 |
1 files changed, 136 insertions, 1 deletions
@@ -84,7 +84,7 @@ error_t file_lookup (file_t dir, char *name, int flags0, int flags1, int mode, file_t *port, struct stat *stat) { - error_t err; + error_t err = 0; file_t p; struct stat s; @@ -121,3 +121,138 @@ file_lookup (file_t dir, char *name, int flags0, int flags1, } return err; } + +#include <fcntl.h> + +char * +make_filepath (char *path, char *filename) +{ + int length; + char *filepath; + + length = strlen (path) + strlen (filename) + 2; + filepath = malloc (length); + if (filepath == NULL) + return NULL; + + strncpy (filepath, path, length); + strncat (filepath, filename, strlen (filename)); + + return filepath; +} + +error_t +for_each_subdir (char *path, error_t (*func) (char *, char *)) +{ + struct dirent **dirent, **dirent_list; + char *dirent_data; + size_t dirent_data_size; + file_t dir; + error_t err; + + dir = file_name_lookup (path, O_READ, 0); + + err = dir_entries_get (dir, &dirent_data, &dirent_data_size, &dirent_list); + if (err) + return err; + + for (dirent = dirent_list; (! err) && (*dirent); dirent++) + { + char *name; + struct stat filestat; + + if ((!strcmp ((*dirent)->d_name, ".")) + || (!strcmp ((*dirent)->d_name, ".."))) + continue; + + name = make_filepath (path, (*dirent)->d_name); + + err = stat (name, &filestat); + + if (err) + return err; + + free (name); + + if (!S_ISDIR(filestat.st_mode)) + continue; + + err = func ((*dirent)->d_name, path); + } + + return err; +} + +error_t +for_each_subdir_priv (char *path, error_t (*func) (char *, char *, void *), + void *priv) +{ + struct dirent **dirent, **dirent_list; + char *dirent_data; + size_t dirent_data_size; + file_t dir; + error_t err; + + dir = file_name_lookup (path, O_READ, 0); + + err = dir_entries_get (dir, &dirent_data, &dirent_data_size, &dirent_list); + if (err) + return err; + + for (dirent = dirent_list; (!err) && (*dirent); dirent++) + { + char *name; + struct stat filestat; + + if ((!strcmp ((*dirent)->d_name, ".")) + || (!strcmp ((*dirent)->d_name, ".."))) + continue; + + name = make_filepath (path, (*dirent)->d_name); + + err = stat (name, &filestat); + + if (err) + return err; + + free (name); + + if (!S_ISDIR(filestat.st_mode)) + continue; + + func ((*dirent)->d_name, path, priv); + } + + return err; +} + +error_t +for_each_file_priv (char *path, error_t (*func) (char *, char *, void *), + void *priv) +{ + struct dirent **dirent, **dirent_list; + char *dirent_data; + size_t dirent_data_size; + file_t dir; + error_t err; + + dir = file_name_lookup (path, O_READ, 0); + + err = dir_entries_get (dir, &dirent_data, &dirent_data_size, &dirent_list); + if (err) + return err; + + for (dirent = dirent_list; (!err) && (*dirent); dirent++) + { + char *name; + struct stat filestat; + + if ((!strcmp ((*dirent)->d_name, ".")) + || (!strcmp ((*dirent)->d_name, ".."))) + continue; + + func ((*dirent)->d_name, path, priv); + } + + return err; +} |