summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorMichal Zidek <mzidek@redhat.com>2015-04-21 17:40:46 +0200
committerJakub Hrozek <jhrozek@redhat.com>2016-07-07 10:24:00 +0200
commit4714118890e51b365fbce543d0a042b4b59b2b25 (patch)
tree0ae26e8a0b7c24178cec70305c24d096acf3206e /src/util
parent71fbf3a10cd9c5a31e1789baf44a9f9f9b0926f1 (diff)
downloadsssd-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/util')
-rw-r--r--src/util/usertools.c56
-rw-r--r--src/util/util.h6
-rw-r--r--src/util/util_errors.c1
-rw-r--r--src/util/util_errors.h1
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 */
};