struct userdefs * getusrdef(char *usertype) { char instr[512], *ptr; const parsent_t *pe; if (is_role(usertype)) { if ((defptr = fopen(DEFROLEFILE, "r")) == NULL) { defaults.defshell = DEFROLESHL; defaults.defprof = DEFROLEPROF; return (&defaults); } } else { if ((defptr = fopen(DEFFILE, "r")) == NULL) return (&defaults); } while (fgets(instr, sizeof (instr), defptr) != NULL) { ptr = instr; SKIPWS(ptr); if (*ptr == '#') continue; pe = scan(&ptr); if (pe != NULL) { switch (pe->type) { case INT: FIELD(&defaults, pe, int) = (int)strtol(ptr, NULL, 10); break; case PROJID: FIELD(&defaults, pe, projid_t) = (projid_t)strtol(ptr, NULL, 10); break; case STR: FIELD(&defaults, pe, char *) = dup_to_nl(ptr); break; } } } (void) fclose(defptr); return (&defaults); }
/* * putusrdef - * changes default values in defadduser file */ int putusrdef(struct userdefs *defs, char *usertype) { time_t timeval; /* time value from time */ int i; ptrdiff_t skip; char *hdr; /* * file format is: * #<tab>Default values for adduser. Changed mm/dd/yy hh:mm:ss. * defgroup=m (m=default group id) * defgname=str1 (str1=default group name) * defparent=str2 (str2=default base directory) * definactive=x (x=default inactive) * defexpire=y (y=default expire) * defproj=z (z=numeric project id) * defprojname=str3 (str3=default project name) * ... etc ... */ if (is_role(usertype)) { if ((defptr = fopen(DEFROLEFILE, "w")) == NULL) { errmsg(M_FAILED); return (EX_UPDATE); } } else { if ((defptr = fopen(DEFFILE, "w")) == NULL) { errmsg(M_FAILED); return (EX_UPDATE); } } if (lockf(fileno(defptr), F_LOCK, 0) != 0) { /* print error if can't lock whole of DEFFILE */ errmsg(M_UPDATE, "created"); return (EX_UPDATE); } if (is_role(usertype)) { /* If it's a role, we must skip the defrole field */ skip = offsetof(struct userdefs, defrole); hdr = FHEADER_ROLE; } else {
int main(int argc, char **argv) { int ch, ret = 0, rflag = 0, argindex, tries; struct passwd *pstruct; struct stat statbuf; #ifndef att FILE *pwf; /* fille ptr for opened passwd file */ #endif char *usertype = NULL; int rc; cmdname = argv[0]; if( geteuid() != 0 ) { errmsg( M_PERM_DENIED ); exit( EX_NO_PERM ); } opterr = 0; /* no print errors from getopt */ usertype = getusertype(argv[0]); while( (ch = getopt(argc, argv, "r")) != EOF ) { switch(ch) { case 'r': rflag++; break; case '?': if (is_role(usertype)) errmsg( M_DRUSAGE ); else errmsg( M_DUSAGE ); exit( EX_SYNTAX ); } } if( optind != argc - 1 ) { if (is_role(usertype)) errmsg( M_DRUSAGE ); else errmsg( M_DUSAGE ); exit( EX_SYNTAX ); } logname = argv[optind]; #ifdef att pstruct = getpwnam(logname); #else /* * Do this with fgetpwent to make sure we are only looking on local * system (since passmgmt only works on local system). */ if ((pwf = fopen("/etc/passwd", "r")) == NULL) { errmsg( M_OOPS, "open", "/etc/passwd"); exit(EX_FAILURE); } while ((pstruct = fgetpwent(pwf)) != NULL) if (strcmp(pstruct->pw_name, logname) == 0) break; fclose(pwf); #endif if (pstruct == NULL) { errmsg( M_EXIST, logname ); exit( EX_NAME_NOT_EXIST ); } if( isbusy(logname) ) { errmsg( M_BUSY, logname, "remove" ); exit( EX_BUSY ); } /* that's it for validations - now do the work */ /* set up arguments to passmgmt in nargv array */ nargv[0] = PASSMGMT; nargv[1] = "-d"; /* delete */ argindex = 2; /* next argument */ /* finally - login name */ nargv[argindex++] = logname; /* set the last to null */ nargv[argindex++] = NULL; /* remove home directory */ if( rflag ) { /* Check Permissions */ if( stat( pstruct->pw_dir, &statbuf ) ) { errmsg(M_OOPS, "find status about home directory", strerror(errno)); exit( EX_HOMEDIR ); } if( check_perm( statbuf, pstruct->pw_uid, pstruct->pw_gid, S_IWOTH|S_IXOTH ) != 0 ) { errmsg( M_NO_PERM, logname, pstruct->pw_dir ); exit( EX_HOMEDIR ); } if( rm_files(pstruct->pw_dir, logname) != EX_SUCCESS ) exit( EX_HOMEDIR ); } /* now call passmgmt */ ret = PEX_FAILED; for( tries = 3; ret != PEX_SUCCESS && tries--; ) { switch( ret = call_passmgmt( nargv ) ) { case PEX_SUCCESS: ret = edit_group( logname, (char *)0, (int **)0, 1 ); if( ret != EX_SUCCESS ) errmsg( M_UPDATE, "deleted" ); break; case PEX_BUSY: break; case PEX_HOSED_FILES: errmsg( M_HOSED_FILES ); exit( EX_INCONSISTENT ); break; case PEX_SYNTAX: case PEX_BADARG: /* should NEVER occur that passmgmt usage is wrong */ if (is_role(usertype)) errmsg( M_DRUSAGE ); else errmsg( M_DUSAGE ); exit( EX_SYNTAX ); break; case PEX_BADUID: /* uid is used - shouldn't happen but print message anyway */ errmsg( M_UID_USED, pstruct->pw_uid ); exit( EX_ID_EXISTS ); break; case PEX_BADNAME: /* invalid loname */ errmsg( M_USED, logname); exit( EX_NAME_EXISTS ); break; default: errmsg( M_UPDATE, "deleted" ); exit( ret ); break; } } if( tries == 0 ) errmsg( M_UPDATE, "deleted" ); /* * Now, remove this user from all project entries */ rc = edit_project(logname, (char *)0, (projid_t **)0, 1); if (rc != EX_SUCCESS) { errmsg(M_UPDATE, "modified"); exit(rc); } exit( ret ); /*NOTREACHED*/ }
void dispusrdef(FILE *fptr, unsigned flags, char *usertype) { struct userdefs *deflts = getusrdef(usertype); int outcount = 0; /* Print out values */ if (flags & D_GROUP) { outcount += fprintf(fptr, "group=%s,%ld ", deflts->defgname, deflts->defgroup); PRINTNL(); } if (flags & D_PROJ) { outcount += fprintf(fptr, "project=%s,%ld ", deflts->defprojname, deflts->defproj); PRINTNL(); } if (flags & D_BASEDIR) { outcount += fprintf(fptr, "basedir=%s ", deflts->defparent); PRINTNL(); } if (flags & D_RID) { outcount += fprintf(fptr, "rid=%ld ", deflts->defrid); PRINTNL(); } if (flags & D_SKEL) { outcount += fprintf(fptr, "skel=%s ", deflts->defskel); PRINTNL(); } if (flags & D_SHELL) { outcount += fprintf(fptr, "shell=%s ", deflts->defshell); PRINTNL(); } if (flags & D_INACT) { outcount += fprintf(fptr, "inactive=%d ", deflts->definact); PRINTNL(); } if (flags & D_EXPIRE) { outcount += fprintf(fptr, "expire=%s ", deflts->defexpire); PRINTNL(); } if (flags & D_AUTH) { outcount += fprintf(fptr, "auths=%s ", deflts->defauth); PRINTNL(); } if (flags & D_PROF) { outcount += fprintf(fptr, "profiles=%s ", deflts->defprof); PRINTNL(); } if ((flags & D_ROLE) && (!is_role(usertype))) { outcount += fprintf(fptr, "roles=%s ", deflts->defrole); PRINTNL(); } if (flags & D_LPRIV) { outcount += fprintf(fptr, "limitpriv=%s ", deflts->deflimpriv); PRINTNL(); } if (flags & D_DPRIV) { outcount += fprintf(fptr, "defaultpriv=%s ", deflts->defdfltpriv); PRINTNL(); } if (flags & D_LOCK) { outcount += fprintf(fptr, "lock_after_retries=%s ", deflts->deflock_after_retries); } if (outcount > 0) (void) fprintf(fptr, "\n"); }