summaryrefslogtreecommitdiff
path: root/lib.c
diff options
context:
space:
mode:
authorGianluca Guida <glguida@gmail.com>2005-01-31 12:30:05 +0000
committerGianluca Guida <glguida@gmail.com>2005-01-31 12:30:05 +0000
commit11a61b22dd0a0a0cc80b3c8594c85fecbb5e679a (patch)
tree82cddf3ab47f4284db20a9d7e4de84494360f55d /lib.c
parentff7f04b7b3db282cba72ed16d9128a6b03816399 (diff)
Added basic stowfs functionalities.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c137
1 files changed, 136 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index 86d8ce5..c15bcae 100644
--- a/lib.c
+++ b/lib.c
@@ -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;
+}