summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_file.c
diff options
context:
space:
mode:
authorDan Callahan <d.callahan@f5.com>2024-02-27 15:15:42 +0000
committerDan Callahan <d.callahan@f5.com>2024-02-27 15:15:42 +0000
commitd76761901c4084bcdbc5a449e9bbb47d56b7093c (patch)
treeb4b7b4e3d588b73a2adcc0094cab466d9194c679 /src/nxt_file.c
parentc43629880472bba8d389dfb0b7ae6d883b0ba499 (diff)
parent088117008c9e8f397a58cc8d8070ce047beff12f (diff)
downloadunit-d76761901c4084bcdbc5a449e9bbb47d56b7093c.tar.gz
unit-d76761901c4084bcdbc5a449e9bbb47d56b7093c.tar.bz2
Merge tag '1.32.0' into branches/packaging1.32.0-1
Unit 1.32.0 release.
Diffstat (limited to 'src/nxt_file.c')
-rw-r--r--src/nxt_file.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/nxt_file.c b/src/nxt_file.c
index 6f1a93e4..4047d9d7 100644
--- a/src/nxt_file.c
+++ b/src/nxt_file.c
@@ -326,6 +326,88 @@ nxt_file_set_access(nxt_file_name_t *name, nxt_file_access_t access)
nxt_int_t
+nxt_file_chown(nxt_file_name_t *name, const char *owner, const char *group)
+{
+ int err;
+ char *buf;
+ long bufsize;
+ gid_t gid = ~0;
+ uid_t uid = ~0;
+
+ if (owner == NULL && group == NULL) {
+ return NXT_OK;
+ }
+
+ if (owner != NULL) {
+ struct passwd pwd, *result;
+
+ bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+ if (bufsize == -1) {
+ bufsize = 32768;
+ }
+
+ buf = nxt_malloc(bufsize);
+ if (buf == NULL) {
+ return NXT_ERROR;
+ }
+
+ err = getpwnam_r(owner, &pwd, buf, bufsize, &result);
+ if (result == NULL) {
+ nxt_thread_log_alert("getpwnam_r(\"%s\", ...) failed %E %s",
+ owner, nxt_errno,
+ err == 0 ? "(User not found)" : "");
+ goto out_err_free;
+ }
+
+ uid = pwd.pw_uid;
+
+ nxt_free(buf);
+ }
+
+ if (group != NULL) {
+ struct group grp, *result;
+
+ bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+ if (bufsize == -1) {
+ bufsize = 32768;
+ }
+
+ buf = nxt_malloc(bufsize);
+ if (buf == NULL) {
+ return NXT_ERROR;
+ }
+
+ err = getgrnam_r(group, &grp, buf, bufsize, &result);
+ if (result == NULL) {
+ nxt_thread_log_alert("getgrnam_r(\"%s\", ...) failed %E %s",
+ group, nxt_errno,
+ err == 0 ? "(Group not found)" : "");
+ goto out_err_free;
+ }
+
+ gid = grp.gr_gid;
+
+ nxt_free(buf);
+ }
+
+ if (nxt_fast_path(chown((const char *) name, uid, gid) == 0)) {
+ return NXT_OK;
+ }
+
+ nxt_thread_log_alert("chown(\"%FN\", %l, %l) failed %E", name,
+ owner != NULL ? (long) uid : -1,
+ group != NULL ? (long) gid : -1, nxt_errno);
+
+ return NXT_ERROR;
+
+out_err_free:
+ nxt_free(buf);
+
+ return NXT_ERROR;
+}
+
+
+nxt_int_t
nxt_file_rename(nxt_file_name_t *old_name, nxt_file_name_t *new_name)
{
int ret;