43
}
44
}
45
46
-void create_needed_dir(const char *dir, uid_t uid, gid_t gid)
46
+void change_dir_ownership(const char *dir, uid_t uid, gid_t gid)
47
{
48
- // attempt to create the directory
49
- if(mkdir(dir, 0755) == 0) {
50
- // we created it
51
-
52
- // chown it to match the required user
53
- if(chown(dir, uid, gid) == -1)
54
- error("Cannot chown directory '%s' to %u:%u", dir, (unsigned int)uid, (unsigned int)gid);
55
- }
56
- else if(errno != EEXIST)
57
- // log an error only if the directory does not exist
58
- error("Cannot create directory '%s'", dir);
48
+ if (chown(dir, uid, gid) == -1)
49
+ error("Cannot chown directory '%s' to %u:%u", dir, (unsigned int)uid, (unsigned int)gid);
50
}
51
52
void clean_directory(char *dirname)
65
closedir(dir);
66
}
67
68
+void prepare_required_directories(uid_t uid, gid_t gid) {
69
+ change_dir_ownership(netdata_configured_cache_dir, uid, gid);
70
+ change_dir_ownership(netdata_configured_varlib_dir, uid, gid);
71
+ change_dir_ownership(netdata_configured_lock_dir, uid, gid);
72
+ change_dir_ownership(netdata_configured_log_dir, uid, gid);
73
+ change_dir_ownership(claimingdirectory, uid, gid);
74
+
75
+ clean_directory(netdata_configured_lock_dir);
76
+}
77
+
78
int become_user(const char *username, int pid_fd) {
79
int am_i_root = (getuid() == 0)?1:0;
80
87
uid_t uid = pw->pw_uid;
88
gid_t gid = pw->pw_gid;
89
89
- create_needed_dir(netdata_configured_cache_dir, uid, gid);
90
- create_needed_dir(netdata_configured_varlib_dir, uid, gid);
91
- create_needed_dir(netdata_configured_lock_dir, uid, gid);
92
- create_needed_dir(claimingdirectory, uid, gid);
93
-
94
- clean_directory(netdata_configured_lock_dir);
90
+ prepare_required_directories(uid, gid);
91
92
if(pidfile[0]) {
93
if(chown(pidfile, uid, gid) == -1)
483
else debug(D_SYSTEM, "Successfully became user '%s'.", user);
484
}
485
else {
490
- create_needed_dir(netdata_configured_cache_dir, getuid(), getgid());
491
- create_needed_dir(netdata_configured_varlib_dir, getuid(), getgid());
492
- create_needed_dir(netdata_configured_lock_dir, getuid(), getgid());
493
- create_needed_dir(claimingdirectory, getuid(), getgid());
494
-
495
- clean_directory(netdata_configured_lock_dir);
486
+ prepare_required_directories(getuid(), getgid());
487
}
488
489
if(pidfd != -1)