Skip to content

Commit

Permalink
Create parent dirs for useradd -m
Browse files Browse the repository at this point in the history
Equivalent of `mkdir -p`. It will create all parent directories.
Example: `useradd -d /home2/testu1 -m testu1`

Based on #2 by Thorsten Kukuk
and Thorsten Behrens which was Code from pwdutils 3.2.2 with slight adaptations.

Adapted to so it applies to current code.
  • Loading branch information
jubalh committed May 15, 2018
1 parent 48dcf78 commit b3b6d9d
Showing 1 changed file with 43 additions and 7 deletions.
50 changes: 43 additions & 7 deletions src/useradd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2018,6 +2018,19 @@ static void usr_update (void)
static void create_home (void)
{
if (access (prefix_user_home, F_OK) != 0) {
char path[strlen (prefix_user_home) + 2];
char *bhome, *cp;

path[0] = '\0';
bhome = strdup (prefix_user_home);
if (!bhome) {
fprintf (stderr,
_("%s: error while duplicating string %s\n"),
Prog, user_home);
fail_exit (E_HOMEDIR);
}
++bhome;

#ifdef WITH_SELINUX
if (set_selinux_file_context (prefix_user_home) != 0) {
fprintf (stderr,
Expand All @@ -2026,19 +2039,42 @@ static void create_home (void)
fail_exit (E_HOMEDIR);
}
#endif
/* XXX - create missing parent directories. --marekm */
if (mkdir (prefix_user_home, 0) != 0) {

/* Check for every part of the path, if the directory
exists. If not, create it with permissions 755 and
owner root:root.
*/
cp = strtok (bhome, "/");
while (cp) {
strcat (path, "/");
strcat (path, cp);
if (access (path, F_OK) != 0) {
if (mkdir (path, 0) != 0) {
fprintf (stderr,
_("%s: cannot create directory %s\n"),
Prog, prefix_user_home);
_("%s: cannot create directory %s\n"),
Prog, path);
#ifdef WITH_AUDIT
audit_logger (AUDIT_ADD_USER, Prog,
"adding home directory",
user_name, (unsigned int) user_id,
SHADOW_AUDIT_FAILURE);
"adding home directory",
user_name, (unsigned int) user_id,
SHADOW_AUDIT_FAILURE);
#endif
fail_exit (E_HOMEDIR);
}
if (chown (path, 0, 0) < 0) {
fprintf (stderr,
_("%s: warning: chown on `%s' failed: %m\n"),
Prog, path);
}
if (chmod (path, 0755) < 0) {
fprintf (stderr,
_("%s: warning: chmod on `%s' failed: %m\n"),
Prog, path);
}
}
cp = strtok (NULL, "/");
}

(void) chown (prefix_user_home, user_id, user_gid);
chmod (prefix_user_home,
0777 & ~getdef_num ("UMASK", GETDEF_DEFAULT_UMASK));
Expand Down

0 comments on commit b3b6d9d

Please sign in to comment.