Print this page
2989 Eliminate use of LOGNAME_MAX in ON
1166 useradd have warning with name more 8 chars
@@ -17,10 +17,12 @@
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
+ * Copyright (c) 2013 Gary Mills
+ *
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* Portions Copyright 2009 Chad Mynhier
*/
@@ -33,10 +35,11 @@
#include <string.h>
#include <libintl.h>
#include <errno.h>
#include <zone.h>
#include <libzonecfg.h>
+#include <wchar.h>
#include "prstat.h"
#include "prutil.h"
#include "prtable.h"
@@ -57,17 +60,31 @@
Die(gettext("invalid user name: %s\n"), name);
return (pwd->pw_uid);
}
void
-pwd_getname(uid_t uid, char *name, int length, int noresolve)
+pwd_getname(uid_t uid, char *name, size_t length, int noresolve,
+ int trunc, size_t width)
{
struct passwd *pwd;
+ size_t n;
if (noresolve || (pwd = getpwuid(uid)) == NULL) {
+ n = snprintf(NULL, 0, "%u", uid);
+ if (trunc && n > width)
+ (void) snprintf(name, length, "%.*u%c",
+ width - 1, uid, '*');
+ else
(void) snprintf(name, length, "%u", uid);
} else {
+ n = mbstowcs(NULL, pwd->pw_name, 0);
+ if (n == (size_t)-1)
+ (void) snprintf(name, length, "%s", "ERROR");
+ else if (trunc && n > width)
+ (void) snprintf(name, length, "%.*s%c",
+ width - 1, pwd->pw_name, '*');
+ else
(void) snprintf(name, length, "%s", pwd->pw_name);
}
}
void