New login_getcapenum(): Allows to read named enum values

Reviewed by:            emaste
Approved by:            emaste (mentor)
MFC after:              3 days
Sponsored by:           Kumacom SAS
Differential Revision:  https://reviews.freebsd.org/D40684
This commit is contained in:
Olivier Certner 2023-06-20 18:41:32 +02:00 committed by Olivier Certner
parent 0d1fe948d9
commit 90e914cd5a
No known key found for this signature in database
GPG key ID: 8CA13040971E2627
2 changed files with 48 additions and 0 deletions

View file

@ -760,6 +760,52 @@ login_getcapnum(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
return val;
}
/*
* Extract a string capability expected to hold a specific value from a list.
*
* 'values' must be a NULL-terminated array of strings listing the possible
* values.
*
* A non-negative return code indicates success, and is the index of the value
* in 'values' the capability is set to.
*
* Negative return codes indicate an error:
* -4: 'lc' or 'cap' insufficiently initialized or not valid.
* -3: System error (allocation failure).
* -2: Capability not found or not a string.
* -1: Capability has a string value, but not one listed in 'values'.
*/
int
login_getcapenum(login_cap_t *lc, const char *cap, const char * const *values)
{
int ret, i;
char *cand;
const char * const *val;
if (lc == NULL || lc->lc_cap == NULL || cap == NULL || *cap == '\0')
return (-4);
ret = cgetstr(lc->lc_cap, cap, &cand);
if (ret == -1)
/* Cap not found. */
return (-2);
else if (ret < 0)
/* System error (normally, allocation failure). */
return (-3);
ret = -1;
for (i = 0, val = values; *val != NULL; val++)
if (strcmp(cand, *val) == 0) {
ret = i;
break;
}
free(cand);
return (ret);
}
/*

View file

@ -110,6 +110,8 @@ const char **login_getcaplist(login_cap_t *, const char *, const char *);
const char *login_getstyle(login_cap_t *, const char *, const char *);
rlim_t login_getcaptime(login_cap_t *, const char *, rlim_t, rlim_t);
rlim_t login_getcapnum(login_cap_t *, const char *, rlim_t, rlim_t);
int login_getcapenum(login_cap_t *lc, const char *cap,
const char * const *values);
rlim_t login_getcapsize(login_cap_t *, const char *, rlim_t, rlim_t);
const char *login_getpath(login_cap_t *, const char *, const char *);
int login_getcapbool(login_cap_t *, const char *, int);