aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-04-03 01:17:10 +0900
committerOphestra <cat@gensokyo.uk>2026-04-03 01:17:10 +0900
commit966fd4df9edbe244ccfab9e2feedfd5a503db2bf (patch)
treef5463276eb635a818df90f15e3344c630d89ada4 /internal
parenta2cf59b9894519f9fb7ee72474fa9468ac62b9d4 (diff)
internal/rosa: connman artifact
Will be gradually replaced with a native implementation. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
-rw-r--r--internal/rosa/all.go1
-rw-r--r--internal/rosa/connman.go109
2 files changed, 110 insertions, 0 deletions
diff --git a/internal/rosa/all.go b/internal/rosa/all.go
index 73061a64..4b87ed69 100644
--- a/internal/rosa/all.go
+++ b/internal/rosa/all.go
@@ -47,6 +47,7 @@ const (
Bison
Bzip2
CMake
+ Connman
Coreutils
Curl
DBus
diff --git a/internal/rosa/connman.go b/internal/rosa/connman.go
new file mode 100644
index 00000000..c59eea8b
--- /dev/null
+++ b/internal/rosa/connman.go
@@ -0,0 +1,109 @@
+package rosa
+
+import "hakurei.app/internal/pkg"
+
+func (t Toolchain) newConnman() (pkg.Artifact, string) {
+ const (
+ version = "2.0"
+ checksum = "MhVTdJOhndnZn2SWd8URKo_Pj7Zvc14tntEbrVOf9L3yVWJvpb3v3Q6104tWJgtW"
+ )
+ return t.NewPackage("connman", version, pkg.NewHTTPGetTar(
+ nil, "https://git.kernel.org/pub/scm/network/connman/connman.git/"+
+ "snapshot/connman-"+version+".tar.gz",
+ mustDecode(checksum),
+ pkg.TarGzip,
+ ), &PackageAttr{
+ Patches: []KV{
+ {"alpine-musl-res", `musl does not implement res_ninit
+
+--- a/gweb/gresolv.c
++++ b/gweb/gresolv.c
+@@ -877,8 +877,6 @@
+ resolv->index = index;
+ resolv->nameserver_list = NULL;
+
+- res_ninit(&resolv->res);
+-
+ return resolv;
+ }
+
+@@ -918,8 +916,6 @@
+
+ flush_nameservers(resolv);
+
+- res_nclose(&resolv->res);
+-
+ g_free(resolv);
+ }
+
+@@ -1022,24 +1018,19 @@
+ debug(resolv, "hostname %s", hostname);
+
+ if (!resolv->nameserver_list) {
+- int i;
+-
+- for (i = 0; i < resolv->res.nscount; i++) {
+- char buf[100];
+- int family = resolv->res.nsaddr_list[i].sin_family;
+- void *sa_addr = &resolv->res.nsaddr_list[i].sin_addr;
+-
+- if (family != AF_INET &&
+- resolv->res._u._ext.nsaddrs[i]) {
+- family = AF_INET6;
+- sa_addr = &resolv->res._u._ext.nsaddrs[i]->sin6_addr;
++ FILE *f = fopen("/etc/resolv.conf", "r");
++ if (f) {
++ char line[256], *s;
++ int i;
++ while (fgets(line, sizeof(line), f)) {
++ if (strncmp(line, "nameserver", 10) || !isspace(line[10]))
++ continue;
++ for (s = &line[11]; isspace(s[0]); s++);
++ for (i = 0; s[i] && !isspace(s[i]); i++);
++ s[i] = 0;
++ g_resolv_add_nameserver(resolv, s, 53, 0);
+ }
+-
+- if (family != AF_INET && family != AF_INET6)
+- continue;
+-
+- if (inet_ntop(family, sa_addr, buf, sizeof(buf)))
+- g_resolv_add_nameserver(resolv, buf, 53, 0);
++ fclose(f);
+ }
+
+ if (!resolv->nameserver_list)
+`},
+ },
+ }, &MakeHelper{
+ Generate: "./bootstrap",
+ },
+ Automake,
+ Libtool,
+ PkgConfig,
+
+ DBus,
+ IPTables,
+ GnuTLS,
+ Readline,
+ KernelHeaders,
+ ), version
+}
+func init() {
+ artifactsM[Connman] = Metadata{
+ f: Toolchain.newConnman,
+
+ Name: "connman",
+ Description: "a daemon for managing Internet connections",
+ Website: "https://git.kernel.org/pub/scm/network/connman/connman.git/",
+
+ Dependencies: P{
+ DBus,
+ IPTables,
+ GnuTLS,
+ Readline,
+ },
+
+ ID: 337,
+ }
+}