#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char**
alloc_directory_lispy_filenames(const char *directory_name)
{
- DIR *dir_ptr;
+ DIR *dir_ptr = opendir(directory_name);
char **result = 0;
- if (dir_ptr = opendir(directory_name)) { /* if opendir success */
+ if (dir_ptr) { /* if opendir success */
struct voidacc va;
if (0 == voidacc_ctor(&va)) { /* if voidacc_ctor success */
struct dirent *dirent_ptr;
- while (dirent_ptr = readdir(dir_ptr)) { /* until end of data */
+ while ( (dirent_ptr = readdir(dir_ptr)) ) { /* until end of data */
char* original_name = dirent_ptr->d_name;
if (is_lispy_filename(original_name)) {
/* strdup(3) is in Linux and *BSD. If you port
}
\f
/*
+ * readlink(2) stuff
+ */
+
+/* a wrapped version of readlink(2):
+ * -- If path isn't a symlink, or is a broken symlink, return 0.
+ * -- If path is a symlink, return a newly allocated string holding
+ * the thing it's linked to. */
+char *
+wrapped_readlink(char *path)
+{
+ int bufsiz = strlen(path) + 16;
+ while (1) {
+ char *result = malloc(bufsiz);
+ int n_read = readlink(path, result, n_read);
+ if (n_read < 0) {
+ free(result);
+ return 0;
+ } else if (n_read < bufsiz) {
+ result[n_read] = 0;
+ return result;
+ } else {
+ free(result);
+ bufsiz *= 2;
+ }
+ }
+}
+\f
+/*
* stat(2) stuff
*/