* Licensed under the GPL v2. For licencing details see COPYING.
*/
-/** \file fd.c Helper functions for file descriptor handling. */
+/** \file fd.c \brief Helper functions for file descriptor handling. */
#include <sys/types.h>
#include <dirent.h>
#include <sys/mman.h>
+#include <string.h>
#include "adu.h"
#include "error.h"
+#include "string.h"
/**
* Wrapper for the write system call.
*
* \return Standard.
*/
-int para_write_file(const char *filename, const void *buf, size_t size)
+int adu_write_file(const char *filename, const void *buf, size_t size)
{
int ret, fd;
* \sa getcwd(3).
*
*/
-int para_opendir(const char *dirname, DIR **dir, int *cwd)
+int adu_opendir(const char *dirname, DIR **dir, int *cwd)
{
int ret;
*
* \return Standard.
*/
-int para_fchdir(int fd)
+int adu_fchdir(int fd)
{
if (fchdir(fd) < 0)
return -ERRNO_TO_ERROR(errno);
*
* \sa munmap(2), mmap_full_file().
*/
-int para_munmap(void *start, size_t length)
+int adu_munmap(void *start, size_t length)
{
int err;
if (munmap(start, length) >= 0)
strerror(err));
return -ERRNO_TO_ERROR(err);
}
+
+__must_check __malloc static char *adu_dirname(const char *name)
+{
+ char *p, *ret;
+
+ if (!name || !*name)
+ return NULL;
+ ret = adu_strdup(name);
+ p = strrchr(ret, '/');
+ if (!p)
+ *ret = '\0';
+ else
+ *p = '\0';
+ return ret;
+}
+
+/**
+ * Recursive mkdir
+ *
+ * \param p Full path that should be created.
+ *
+ * \param mode Use this mode when creating directories.
+ *
+ * \return 0 if successful, -E_MKDIR on errors.
+ */
+int mkpath(const char *p, mode_t mode)
+{
+ char *parent, *path;
+ int ret = -E_MKDIR;
+
+ DEBUG_LOG("%s\n", p);
+ if (strcmp(p, ".") == 0 || strcmp(p, "/") == 0 || strcmp(p, "") == 0) {
+ DEBUG_LOG("reached beginning of path\n");
+ return 0;
+ }
+ path = adu_strdup(p);
+ parent = adu_dirname(p);
+ if (!parent)
+ goto out;
+ ret = mkpath(parent, mode);
+ if (ret < 0)
+ goto out;
+ INFO_LOG("making dir %s\n", path);
+ ret = 0;
+ if ((mkdir(path, mode) == -1) && (errno != EEXIST))
+ ret = -E_MKDIR;
+out:
+ free(parent);
+ free(path);
+ return ret;
+}