diff options
author | Michal Zidek <mzidek@redhat.com> | 2015-04-21 17:40:46 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2016-07-07 10:24:00 +0200 |
commit | 4714118890e51b365fbce543d0a042b4b59b2b25 (patch) | |
tree | 0ae26e8a0b7c24178cec70305c24d096acf3206e /src | |
parent | 71fbf3a10cd9c5a31e1789baf44a9f9f9b0926f1 (diff) | |
download | sssd-4714118890e51b365fbce543d0a042b4b59b2b25.tar.gz sssd-4714118890e51b365fbce543d0a042b4b59b2b25.tar.xz sssd-4714118890e51b365fbce543d0a042b4b59b2b25.zip |
UTIL: Add function to parse internal fqname format
Add lightweight function to parse internal fqname format
(shortname@domain). This function does not require the
sss_names to be initialized.
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/util/usertools.c | 56 | ||||
-rw-r--r-- | src/util/util.h | 6 | ||||
-rw-r--r-- | src/util/util_errors.c | 1 | ||||
-rw-r--r-- | src/util/util_errors.h | 1 |
4 files changed, 64 insertions, 0 deletions
diff --git a/src/util/usertools.c b/src/util/usertools.c index 18639d9b6..bea7e58a8 100644 --- a/src/util/usertools.c +++ b/src/util/usertools.c @@ -716,3 +716,59 @@ errno_t sss_user_by_name_or_uid(const char *input, uid_t *_uid, gid_t *_gid) } return EOK; } + +/* Accepts fqname in the format shortname@domname only. */ +errno_t sss_parse_internal_fqname(TALLOC_CTX *mem_ctx, + const char *fqname, + char **_shortname, + char **_dom_name) +{ + errno_t ret; + char *separator; + char *shortname = NULL; + char *dom_name = NULL; + size_t shortname_len; + TALLOC_CTX *tmp_ctx; + + if (fqname == NULL) { + return EINVAL; + } + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + separator = strrchr(fqname, '@'); + if (separator == NULL || *(separator + 1) == '\0' || separator == fqname) { + /*The name does not contain name or domain component. */ + ret = ERR_WRONG_NAME_FORMAT; + goto done; + } + + if (_dom_name != NULL) { + dom_name = talloc_strdup(tmp_ctx, separator + 1); + if (dom_name == NULL) { + ret = ENOMEM; + goto done; + } + + *_dom_name = talloc_steal(mem_ctx, dom_name); + } + + if (_shortname != NULL) { + shortname_len = strlen(fqname) - strlen(separator); + shortname = talloc_strndup(tmp_ctx, fqname, shortname_len); + if (shortname == NULL) { + ret = ENOMEM; + goto done; + } + + *_shortname = talloc_steal(mem_ctx, shortname); + } + + ret = EOK; +done: + talloc_free(tmp_ctx); + return ret; +} diff --git a/src/util/util.h b/src/util/util.h index 92076488a..57819cf8a 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -272,6 +272,12 @@ char * sss_get_domain_name(TALLOC_CTX *mem_ctx, const char *orig_name, struct sss_domain_info *dom); +/* Accepts fqname in the format shortname@domname only. */ +errno_t sss_parse_internal_fqname(TALLOC_CTX *mem_ctx, + const char *fqname, + char **_shortname, + char **_dom_name); + /* from backup-file.c */ int backup_file(const char *src, int dbglvl); diff --git a/src/util/util_errors.c b/src/util/util_errors.c index 522b0f4ff..620be3c0a 100644 --- a/src/util/util_errors.c +++ b/src/util/util_errors.c @@ -97,6 +97,7 @@ struct err_string error_to_str[] = { { "No timestamp cache record" }, /* ERR_TS_CACHE_MISS */ { "Dereference threshold reached" }, /* ERR_DEREF_THRESHOLD */ { "The user is not handled by SSSD" }, /* ERR_NON_SSSD_USER */ + { "The internal name format cannot be parsed" }, /* ERR_WRONG_NAME_FORMAT */ { "ERR_LAST" } /* ERR_LAST */ }; diff --git a/src/util/util_errors.h b/src/util/util_errors.h index 15ec5974b..1f00ba348 100644 --- a/src/util/util_errors.h +++ b/src/util/util_errors.h @@ -119,6 +119,7 @@ enum sssd_errors { ERR_TS_CACHE_MISS, ERR_DEREF_THRESHOLD, ERR_NON_SSSD_USER, + ERR_WRONG_NAME_FORMAT, ERR_LAST /* ALWAYS LAST */ }; |