Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
glibc/nss/tst-nss-getpwent.c
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
118 lines (108 sloc)
2.85 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Copyright (C) 2015-2016 Free Software Foundation, Inc. | |
This file is part of the GNU C Library. | |
The GNU C Library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) any later version. | |
The GNU C Library is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with the GNU C Library; if not, see | |
<http://www.gnu.org/licenses/>. */ | |
#include <pwd.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
int | |
do_test (void) | |
{ | |
/* Count the number of entries in the password database, and fetch | |
data from the first and last entries. */ | |
size_t count = 0; | |
struct passwd * pw; | |
char *first_name = NULL; | |
uid_t first_uid = 0; | |
char *last_name = NULL; | |
uid_t last_uid = 0; | |
setpwent (); | |
while ((pw = getpwent ()) != NULL) | |
{ | |
if (first_name == NULL) | |
{ | |
first_name = strdup (pw->pw_name); | |
if (first_name == NULL) | |
{ | |
printf ("strdup: %m\n"); | |
return 1; | |
} | |
first_uid = pw->pw_uid; | |
} | |
free (last_name); | |
last_name = strdup (pw->pw_name); | |
if (last_name == NULL) | |
{ | |
printf ("strdup: %m\n"); | |
return 1; | |
} | |
last_uid = pw->pw_uid; | |
++count; | |
} | |
endpwent (); | |
if (count == 0) | |
{ | |
printf ("No entries in the password database.\n"); | |
return 0; | |
} | |
/* Try again, this time interleaving with name-based and UID-based | |
lookup operations. The counts do not match if the interleaved | |
lookups affected the enumeration. */ | |
size_t new_count = 0; | |
setpwent (); | |
while ((pw = getpwent ()) != NULL) | |
{ | |
if (new_count == count) | |
{ | |
printf ("Additional entry in the password database.\n"); | |
return 1; | |
} | |
++new_count; | |
struct passwd *pw2 = getpwnam (first_name); | |
if (pw2 == NULL) | |
{ | |
printf ("getpwnam (%s) failed: %m\n", first_name); | |
return 1; | |
} | |
pw2 = getpwnam (last_name); | |
if (pw2 == NULL) | |
{ | |
printf ("getpwnam (%s) failed: %m\n", last_name); | |
return 1; | |
} | |
pw2 = getpwuid (first_uid); | |
if (pw2 == NULL) | |
{ | |
printf ("getpwuid (%llu) failed: %m\n", | |
(unsigned long long) first_uid); | |
return 1; | |
} | |
pw2 = getpwuid (last_uid); | |
if (pw2 == NULL) | |
{ | |
printf ("getpwuid (%llu) failed: %m\n", | |
(unsigned long long) last_uid); | |
return 1; | |
} | |
} | |
endpwent (); | |
if (new_count < count) | |
{ | |
printf ("Missing entry in the password database.\n"); | |
return 1; | |
} | |
return 0; | |
} | |
#define TEST_FUNCTION do_test () | |
#include "../test-skeleton.c" |