From bcf57467dd4548135db507dceded3148cd0fc941 Mon Sep 17 00:00:00 2001
From: lemoer <git@irrelefant.net>
Date: Wed, 13 May 2020 02:02:49 +0200
Subject: [PATCH] libgluonutil: implement gluonutil_get_primary_domain()

Implemented using readlink() and basename() to the selected domain in
/lib/gluon/domains/${DOMAIN}.json.
---
 package/libgluonutil/src/libgluonutil.c | 41 +++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/package/libgluonutil/src/libgluonutil.c b/package/libgluonutil/src/libgluonutil.c
index c2cfa18d6..e7a88fd1b 100644
--- a/package/libgluonutil/src/libgluonutil.c
+++ b/package/libgluonutil/src/libgluonutil.c
@@ -33,6 +33,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
+#include <errno.h>
 
 /**
  * Merges two JSON objects
@@ -212,6 +214,45 @@ uci_fail:
 	return ret;
 }
 
+char * gluonutil_get_primary_domain(void) {
+	if (!gluonutil_has_domains())
+		return NULL;
+
+	char *domain_code = gluonutil_get_domain();
+	if (!domain_code)
+		return NULL;
+
+	const char *domain_path_fmt = "/lib/gluon/domains/%s.json";
+	char domain_path[strlen(domain_path_fmt) + strlen(domain_code)];
+	snprintf(domain_path, sizeof(domain_path), domain_path_fmt, domain_code);
+
+	char primary_domain_path[PATH_MAX+1];
+	char *primary_domain_code;
+	ssize_t len = readlink(domain_path, primary_domain_path, PATH_MAX);
+	if (len < 0) {
+		// EINVAL = file is not a symlink = the domain itself is the primary domain
+		if (errno != EINVAL) {
+			free(domain_code);
+			return NULL;
+		}
+
+		return domain_code;
+	}
+
+	free(domain_code);
+
+	primary_domain_path[len] = '\0';
+	primary_domain_code = basename(primary_domain_path);
+
+	char *ext_begin = strrchr(primary_domain_code, '.');
+	if (!ext_begin)
+		return NULL;
+
+	// strip .json from filename
+	*ext_begin = '\0';
+	return strdup(primary_domain_code);
+}
+
 
 struct json_object * gluonutil_load_site_config(void) {
 	char *domain_code = NULL;
-- 
GitLab