#include <sys/types.h>
#include <stdio.h>
#include <ctype.h>
#include <userdefs.h>
#include <users.h>
#include <deflt.h>
#include <limits.h>
#define DEFAULT_USERADD "/etc/default/useradd"
int
valid_login(char *login, struct passwd **pptr, int *warning)
{
struct passwd *t_pptr;
char *ptr = login;
int bad1char, badc, clower, len;
char c;
char action;
len = 0; clower = 0; badc = 0; bad1char = 0;
*warning = 0;
if (!login || !*login)
return (INVALID);
c = *ptr;
if (!isalpha(c))
bad1char++;
for (; c != '\0'; ptr++, c = *ptr) {
len++;
if (!isprint(c) || (c == ':') || (c == '\n'))
return (INVALID);
if (!isalnum(c) && c != '_' && c != '-' && c != '.')
badc++;
if (islower(c))
clower++;
}
action = 'w';
if (defopen(DEFAULT_USERADD) == 0) {
char *defptr;
if ((defptr = defread("EXCEED_TRAD=")) != NULL) {
char let = tolower(*defptr);
switch (let) {
case 'w':
case 'e':
case 's':
action = let;
break;
}
}
(void) defopen((char *)NULL);
}
if (len > LOGNAME_MAX)
return (LONGNAME);
if (len > LOGNAME_MAX_TRAD) {
if (action == 'w')
*warning = *warning | WARN_NAME_TOO_LONG;
else if (action == 'e')
return (LONGNAME);
}
if (clower == 0)
*warning = *warning | WARN_NO_LOWERCHAR;
if (badc != 0)
*warning = *warning | WARN_BAD_LOGNAME_CHAR;
if (bad1char != 0)
*warning = *warning | WARN_BAD_LOGNAME_FIRST;
if ((t_pptr = getpwnam(login)) != NULL) {
if (pptr) *pptr = t_pptr;
return (NOTUNIQUE);
}
return (UNIQUE);
}