static void setuidgid(const char *userarg, const char *grouparg) { if (grouparg) { gid_t gid = 0; struct group *gr; if (isid(grouparg)) gid=atoi(grouparg); else if ((gr=getgrnam(grouparg)) == 0) { fprintf(stderr, "Group not found: %s\n", grouparg); exit(1); } else gid=gr->gr_gid; libmail_changegroup(gid); } if (userarg) { uid_t uid; if (isid(userarg)) { uid=atoi(userarg); libmail_changeuidgid(uid, getgid()); } else { gid_t g=getgid(), *gp=0; if (grouparg) gp= &g; libmail_changeusername(userarg, gp); } } }
int auth_callback_default(struct authinfo *ainfo) { if (ainfo->address == NULL) { fprintf(stderr, "WARN: No address!!\n"); return (-1); } if (ainfo->sysusername) libmail_changeusername(ainfo->sysusername, &ainfo->sysgroupid); else if (ainfo->sysuserid) libmail_changeuidgid(*ainfo->sysuserid, ainfo->sysgroupid); else { fprintf(stderr, "WARN: %s: No UID/GID!!\n", ainfo->address); return (-1); } if (!ainfo->homedir) { errno=EINVAL; fprintf(stderr, "WARN: %s: No homedir!!\n", ainfo->address); return (1); } if (chdir(ainfo->homedir)) { fprintf(stderr, "WARN: %s: chdir(%s) failed!!\n", ainfo->address, ainfo->homedir); perror("WARN: error"); return (1); } return 0; }