]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add function for common case of mkdir
authorAlan T. DeKok <aland@freeradius.org>
Thu, 3 Oct 2024 14:02:52 +0000 (10:02 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 8 Oct 2024 13:52:45 +0000 (09:52 -0400)
src/lib/util/file.c
src/lib/util/file.h

index 3cd094bcda33609a2ebb71ae3f93804ea74b261c..182598e2468327ab6cb849fb18fd840674685735 100644 (file)
@@ -33,6 +33,25 @@ RCSID("$Id$")
 #include <freeradius-devel/util/syserror.h>
 #include <freeradius-devel/util/value.h>
 
+/** Callback for the common case of chown() of the directory.
+ *
+ */
+int fr_mkdir_chown(int fd, char const *path, void *uctx)
+{
+       fr_mkdir_chown_t const *ctx = uctx;
+
+       if ((ctx->uid == (uid_t) -1) && (ctx->gid == (gid_t) -1)) return 0;
+
+       if (fchown(fd, ctx->uid, ctx->gid) < 0) {
+               fr_strerror_printf("Failed changing ownership on directory \"%s\": %s",
+                                  path, fr_syserror(errno));
+               return -1;
+       }
+
+       return 0;
+}
+
+
 static ssize_t _fr_mkdir(int *fd_out, char *start, char *path, mode_t mode, fr_mkdir_func_t func, void *uctx)
 {
        int             ret, fd;
index 29d3b16c0693a372be2a70eed20a5bbf4be4910e..a95d4ecbddee28a251d2f0c415fa7c7557fe8951 100644 (file)
@@ -44,6 +44,13 @@ extern "C" {
  */
 typedef int(*fr_mkdir_func_t)(int fd, char const *path, void *uctx);
 
+typedef struct {
+       uid_t           uid;
+       gid_t           gid;
+} fr_mkdir_chown_t;
+
+int            fr_mkdir_chown(int fd, char const *path, void *uctx);
+
 ssize_t                fr_mkdir(int *fd_out, char const *path, ssize_t len, mode_t mode,
                         fr_mkdir_func_t func, void *uctx);