struct stat st;
char line[_PASSWORD_LEN+1];
FILE *fp;
+ mode_t dmode;
+ char *dmode_c;
+ void *set = NULL;
static struct passwd fakeuser =
{
cnf->home = arg->val;
}
+ if ((arg = getarg(args, 'M')) != NULL) {
+ dmode_c = arg->val;
+ if ((set = setmode(dmode_c)) == NULL)
+ errx(EX_DATAERR, "invalid directory creation mode '%s'",
+ dmode_c);
+ dmode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO);
+ free(set);
+ } else
+ dmode = S_IRWXU | S_IRWXG | S_IRWXO;
+
/*
* If we'll need to use it or we're updating it,
* then create the base home directory if necessary
if (strchr(cnf->home+1, '/') == NULL) {
strcpy(dbuf, "/usr");
strncat(dbuf, cnf->home, MAXPATHLEN-5);
- if (mkdir(dbuf, 0755) != -1 || errno == EEXIST) {
+ if (mkdir(dbuf, dmode) != -1 || errno == EEXIST) {
chown(dbuf, 0, 0);
- symlink(dbuf, cnf->home);
+ /*
+ * Skip first "/" and create symlink:
+ * /home -> usr/home
+ */
+ symlink(dbuf+1, cnf->home);
}
/* If this falls, fall back to old method */
}
- p = strncpy(dbuf, cnf->home, sizeof dbuf);
- dbuf[MAXPATHLEN-1] = '\0';
+ strlcpy(dbuf, cnf->home, sizeof(dbuf));
+ p = dbuf;
if (stat(dbuf, &st) == -1) {
while ((p = strchr(++p, '/')) != NULL) {
*p = '\0';
if (stat(dbuf, &st) == -1) {
- if (mkdir(dbuf, 0755) == -1)
+ if (mkdir(dbuf, dmode) == -1)
goto direrr;
chown(dbuf, 0, 0);
} else if (!S_ISDIR(st.st_mode))
}
}
if (stat(dbuf, &st) == -1) {
- if (mkdir(dbuf, 0755) == -1) {
+ if (mkdir(dbuf, dmode) == -1) {
direrr: err(EX_OSFILE, "mkdir '%s'", dbuf);
}
chown(dbuf, 0, 0);
* invalidated by deletion
*/
sprintf(file, "%s/%s", _PATH_MAILDIR, pwd->pw_name);
- strncpy(home, pwd->pw_dir, sizeof home);
- home[sizeof home - 1] = '\0';
+ strlcpy(home, pwd->pw_dir, sizeof(home));
rc = delpwent(pwd);
if (rc == -1)
* existing files will *not* be overwritten.
*/
if (!PWALTDIR() && getarg(args, 'm') != NULL && pwd->pw_dir && *pwd->pw_dir == '/' && pwd->pw_dir[1]) {
- copymkdir(pwd->pw_dir, cnf->dotdir, 0755, pwd->pw_uid, pwd->pw_gid);
+ copymkdir(pwd->pw_dir, cnf->dotdir, dmode, pwd->pw_uid, pwd->pw_gid);
pw_log(cnf, mode, W_USER, "%s(%ld) home %s made",
pwd->pw_name, (long) pwd->pw_uid, pwd->pw_dir);
}
/*
* We need to search paths
*/
- strncpy(paths, path, sizeof paths);
- paths[sizeof paths - 1] = '\0';
+ strlcpy(paths, path, sizeof(paths));
for (p = strtok(paths, ": \t\r\n"); p != NULL; p = strtok(NULL, ": \t\r\n")) {
int i;
static char shellpath[256];
return "*";
case 1: /* user's name */
- strncpy(pwbuf, user, sizeof pwbuf);
- pwbuf[sizeof pwbuf - 1] = '\0';
+ strlcpy(pwbuf, user, sizeof(pwbuf));
break;
}
return pw_pwcrypt(pwbuf);
struct tm * tptr;
if ((p = strtok(pwd->pw_gecos, ",")) != NULL) {
- strncpy(uname, p, sizeof uname);
- uname[sizeof uname - 1] = '\0';
+ strlcpy(uname, p, sizeof(uname));
if ((p = strtok(NULL, ",")) != NULL) {
- strncpy(office, p, sizeof office);
- office[sizeof office - 1] = '\0';
+ strlcpy(office, p, sizeof(office));
if ((p = strtok(NULL, ",")) != NULL) {
- strncpy(wphone, p, sizeof wphone);
- wphone[sizeof wphone - 1] = '\0';
+ strlcpy(wphone, p, sizeof(wphone));
if ((p = strtok(NULL, "")) != NULL) {
- strncpy(hphone, p, sizeof hphone);
- hphone[sizeof hphone - 1] = '\0';
+ strlcpy(hphone, p,
+ sizeof(hphone));
}
}
}