[PATCH v9 1/2] lib: New library function tst_get_free_uid
Wei Gao via ltp <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
Add tst_get_free_uid() to dynamically find unused UIDs for tests. Signed-off-by: Wei Gao <wegao-IBi9RG/[email protected]> --- include/tst_uid.h | 7 +++++-- lib/tst_uid.c | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/tst_uid.h b/include/tst_uid.h index 2237ddcbf..394cb3edc 100644 --- a/include/tst_uid.h +++ b/include/tst_uid.h @@ -8,10 +8,13 @@ #include <sys/types.h> /* - * Find unassigned gid. The skip argument can be used to ignore e.g. the main + * Find unassigned uid/gid. The skip argument can be used to ignore e.g. the main * group of a specific user in case it's not listed in the group file. If you - * do not need to skip any specific gid, simply set it to 0. + * do not need to skip any specific id, simply set it to 0. */ +uid_t tst_get_free_uid_(const char *file, const int lineno, uid_t skip); +#define tst_get_free_uid(skip) tst_get_free_uid_(__FILE__, __LINE__, (skip)) + gid_t tst_get_free_gid_(const char *file, const int lineno, gid_t skip); #define tst_get_free_gid(skip) tst_get_free_gid_(__FILE__, __LINE__, (skip)) diff --git a/lib/tst_uid.c b/lib/tst_uid.c index af4ef8cf7..deff17085 100644 --- a/lib/tst_uid.c +++ b/lib/tst_uid.c @@ -5,6 +5,7 @@ #include <sys/types.h> #include <grp.h> +#include <pwd.h> #include <errno.h> #define TST_NO_DEFAULT_MAIN @@ -12,6 +13,31 @@ #include "tst_uid.h" #define MAX_GID 32767 +#define MAX_UID 32767 + +uid_t tst_get_free_uid_(const char *file, const int lineno, uid_t skip) +{ + uid_t ret; + + errno = 0; + + for (ret = 1; ret < MAX_UID; ret++) { + if (ret == skip || getpwuid(ret)) + continue; + + if (errno == 0 || errno == ENOENT || errno == ESRCH) { + tst_res_(file, lineno, TINFO | TERRNO, + "Found unused UID %d", (int)ret); + return ret; + } + + tst_brk_(file, lineno, TBROK|TERRNO, "User ID lookup failed"); + return (uid_t)-1; + } + + tst_brk_(file, lineno, TBROK, "No free user ID found"); + return (uid_t)-1; +} gid_t tst_get_free_gid_(const char *file, const int lineno, gid_t skip) { -- 2.54.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp