user-accounts: Fix definition of MAXNAMELEN
Currently we get MAXNAMELEN from glibc's LOGIN_NAME_MAX, if available, and sysconf otherwise. But the maximum username length supported by glibc and the kernel is actually way larger than the maximum length that actually works in practice. On Linux, anything larger than 32 characters is not going to fit into utmp, and will therefore be rejected by useradd. Then gnome-control-center will spit out a confusing error message dialog. Let's spare our users from that. useradd (in shadow-utils) gets its max name size from the following magic: /* Maximum length of usernames */ #ifdef HAVE_UTMPX_H # include <utmpx.h> # define USER_NAME_MAX_LENGTH (sizeof (((struct utmpx *)NULL)->ut_user)) #else # include <utmp.h> # ifdef HAVE_STRUCT_UTMP_UT_USER # define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_user)) # else # ifdef HAVE_STRUCT_UTMP_UT_NAME # define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_name)) # else # define USER_NAME_MAX_LENGTH 32 # endif # endif #endif It's more work than necessary. utmpx is standardized by POSIX (it's actually an XSI extension), whereas utmp is not, so let's just use utmpx. This ought to work on at least FreeBSD as well. And if any free operating systems that care about GNOME don't have utmpx yet, no doubt they'll send patches. https://bugzilla.gnome.org/show_bug.cgi?id=724193
This commit is contained in:
parent
d14e1b830a
commit
09b94a9b53
1 changed files with 7 additions and 18 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <utmpx.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
@ -404,24 +405,12 @@ rounded_rectangle (cairo_t *cr,
|
||||||
cairo_close_path (cr);
|
cairo_close_path (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
/* Taken from defines.h in shadow-utils. On Linux, this value is much smaller
|
||||||
get_login_name_max (void)
|
* than the sysconf limit LOGIN_NAME_MAX, and values larger than this will
|
||||||
{
|
* result in failure when running useradd. We could check UT_NAMESIZE instead,
|
||||||
#ifdef LOGIN_NAME_MAX
|
* but that is nonstandard. Better to use POSIX utmpx.
|
||||||
return LOGIN_NAME_MAX;
|
*/
|
||||||
#else
|
#define MAXNAMELEN (sizeof (((struct utmpx *)NULL)->ut_user))
|
||||||
static gint length;
|
|
||||||
|
|
||||||
if (!length) {
|
|
||||||
length = sysconf (_SC_LOGIN_NAME_MAX);
|
|
||||||
g_assert_cmpint (length, >=, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return length;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAXNAMELEN get_login_name_max ()
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_username_used (const gchar *username)
|
is_username_used (const gchar *username)
|
||||||
|
|
Loading…
Add table
Reference in a new issue