Print this page
2989 Eliminate use of LOGNAME_MAX in ON
1166 useradd have warning with name more 8 chars

@@ -18,29 +18,35 @@
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  */
 /*
+ * Copyright (c) 2013 Gary Mills
+ *
  * Copyright (c) 1997, by Sun Microsystems, Inc.
  * All rights reserved.
  */
 
 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
 /*        All Rights Reserved   */
 
-
-#pragma ident   "%Z%%M% %I%     %E% SMI"        /* SVr4.0 1.3 */
-
 /*LINTLIBRARY*/
 
 #include        <sys/types.h>
 #include        <stdio.h>
 #include        <ctype.h>
 #include        <userdefs.h>
 #include        <users.h>
+#include        <deflt.h>
 #include        <limits.h>
 
+/* Defaults file */
+#define DEFAULT_USERADD "/etc/default/useradd"
+
+/* Traditional length limit */
+#define TRAD_LEN_MAX    8
+
 /*
  * validate string given as login name.
  */
 int
 valid_login(char *login, struct passwd **pptr, int *warning)

@@ -47,10 +53,11 @@
 {
         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);

@@ -66,16 +73,38 @@
                         badc++;
                 if (islower(c))
                         clower++;
         }
 
-        /*
-         * XXX length checking causes some operational/compatibility problem.
-         * This has to be revisited in the future as ARC/standards issue.
-         */
+        action = 'w';
+        if (defopen(DEFAULT_USERADD) == 0) {
+                char *defptr;
+
+                if ((defptr = defread("EXCEED_TRAD=")) != NULL) {
+                        char let = tolower(*defptr);
+
+                        switch (let) {
+                        case 'w':       /* warning */
+                        case 'e':       /* error */
+                        case 's':       /* silent */
+                                action = let;
+                                break;
+                        }
+                }
+                (void) defopen((char *)NULL);
+        }
+
         if (len > LOGNAME_MAX)
+                return (LONGNAME);
+
+        if (len > TRAD_LEN_MAX) {
+                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)