/* Test userspec.c
- Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Copyright (C) 2009-2013 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
struct test
{
- char *in;
+ const char *in;
uid_t uid;
gid_t gid;
- char *user_name;
- char *group_name;
- char *result;
+ const char *user_name;
+ const char *group_name;
+ const char *result;
};
static struct test T[] =
{
unsigned int i;
int fail = 0;
- uid_t uid;
/* Find a UID that has both a user name and login group name,
but skip UID 0. */
- for (uid = 1200; 0 < uid; uid--)
- {
- struct group *gr;
- struct passwd *pw = getpwuid (uid);
- unsigned int j;
- size_t len;
- if (!pw || !pw->pw_name || !(gr = getgrgid (pw->pw_gid)) || !gr->gr_name)
- continue;
- j = ARRAY_CARDINALITY (T) - 2;
- assert (T[j].in == NULL);
- assert (T[j+1].in == NULL);
- len = strlen (pw->pw_name);
-
- /* Store "username:" in T[j].in. */
- T[j].in = xmalloc (len + 1 + 1);
- memcpy (T[j].in, pw->pw_name, len);
- T[j].in[len] = ':';
- T[j].in[len+1] = '\0';
-
- T[j].uid = uid;
- T[j].gid = gr->gr_gid;
- T[j].user_name = xstrdup (pw->pw_name);
- T[j].group_name = xstrdup (gr->gr_name);
- T[j].result = NULL;
- break;
- }
+ {
+ uid_t uid;
+ for (uid = 1200; 0 < uid; uid--)
+ {
+ struct group *gr;
+ struct passwd *pw = getpwuid (uid);
+ unsigned int j;
+ size_t len;
+ if (!pw || !pw->pw_name || !(gr = getgrgid (pw->pw_gid)) || !gr->gr_name)
+ continue;
+ j = ARRAY_CARDINALITY (T) - 2;
+ assert (T[j].in == NULL);
+ assert (T[j+1].in == NULL);
+ len = strlen (pw->pw_name);
+
+ /* Store "username:" in T[j].in. */
+ {
+ char *t = xmalloc (len + 1 + 1);
+ memcpy (t, pw->pw_name, len);
+ t[len] = ':';
+ t[len+1] = '\0';
+ T[j].in = t;
+ }
+
+ T[j].uid = uid;
+ T[j].gid = gr->gr_gid;
+ T[j].user_name = xstrdup (pw->pw_name);
+ T[j].group_name = xstrdup (gr->gr_name);
+ T[j].result = NULL;
+ break;
+ }
+ }
for (i = 0; T[i].in; i++)
{
char *user_name;
char *group_name;
char const *diag = parse_user_spec (T[i].in, &uid, &gid,
- &user_name, &group_name);
+ &user_name, &group_name);
free (user_name);
free (group_name);
if (!same_diag (diag, T[i].result))
if (uid != T[i].uid || gid != T[i].gid)
{
printf ("%s mismatch (-: expected uid,gid; +:actual)\n"
- "-%3lu,%3lu\n+%3lu,%3lu\n",
- T[i].in,
+ "-%3lu,%3lu\n+%3lu,%3lu\n",
+ T[i].in,
(unsigned long int) T[i].uid,
(unsigned long int) T[i].gid,
(unsigned long int) uid,
{
printf ("%s diagnostic mismatch (-: expected uid,gid; +:actual)\n"
- "-%s\n+%s\n",
- T[i].in, T[i].result, diag);
+ "-%s\n+%s\n",
+ T[i].in, T[i].result, diag);
fail = 1;
}
}
+ /* Ensure NULL parameters are ignored. */
+ {
+ uid_t uid = (uid_t) -1;
+ char const *diag = parse_user_spec ("", &uid, NULL, NULL, NULL);
+ if (diag)
+ {
+ printf ("unexpected error: %s\n", diag);
+ fail = 1;
+ }
+ }
+
return fail;
}