internal/rosa: include iana-etc
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m41s
Test / Hakurei (push) Successful in 3m57s
Test / ShareFS (push) Successful in 3m59s
Test / Hpkg (push) Successful in 4m36s
Test / Sandbox (race detector) (push) Successful in 5m0s
Test / Hakurei (race detector) (push) Successful in 5m57s
Test / Flake checks (push) Successful in 1m52s
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m41s
Test / Hakurei (push) Successful in 3m57s
Test / ShareFS (push) Successful in 3m59s
Test / Hpkg (push) Successful in 4m36s
Test / Sandbox (race detector) (push) Successful in 5m0s
Test / Hakurei (race detector) (push) Successful in 5m57s
Test / Flake checks (push) Successful in 1m52s
This is used by some programs and will likely end up in the Rosa OS system image anyway. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -1,7 +1,10 @@
|
|||||||
package rosa
|
package rosa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"hakurei.app/internal/pkg"
|
"hakurei.app/internal/pkg"
|
||||||
)
|
)
|
||||||
@@ -9,10 +12,13 @@ import (
|
|||||||
// cureEtc contains deterministic elements of /etc, made available as part of
|
// cureEtc contains deterministic elements of /etc, made available as part of
|
||||||
// [Toolchain]. This silences test suites expecting certain standard files to be
|
// [Toolchain]. This silences test suites expecting certain standard files to be
|
||||||
// available in /etc.
|
// available in /etc.
|
||||||
type cureEtc struct{}
|
type cureEtc struct {
|
||||||
|
// Optional via newIANAEtc.
|
||||||
|
iana pkg.Artifact
|
||||||
|
}
|
||||||
|
|
||||||
// Cure writes hardcoded configuration to files under etc.
|
// Cure writes hardcoded configuration to files under etc.
|
||||||
func (cureEtc) Cure(t *pkg.TContext) (err error) {
|
func (a cureEtc) Cure(t *pkg.FContext) (err error) {
|
||||||
etc := t.GetWorkDir().Append("etc")
|
etc := t.GetWorkDir().Append("etc")
|
||||||
if err = os.MkdirAll(etc.String(), 0700); err != nil {
|
if err = os.MkdirAll(etc.String(), 0700); err != nil {
|
||||||
return
|
return
|
||||||
@@ -36,6 +42,44 @@ nobody:x:65534:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if a.iana != nil {
|
||||||
|
iana, _ := t.GetArtifact(a.iana)
|
||||||
|
|
||||||
|
buf := make([]byte, syscall.Getpagesize()<<3)
|
||||||
|
for _, name := range []string{
|
||||||
|
"protocols",
|
||||||
|
"services",
|
||||||
|
} {
|
||||||
|
var dst, src *os.File
|
||||||
|
if dst, err = os.OpenFile(
|
||||||
|
etc.Append(name).String(),
|
||||||
|
syscall.O_CREAT|syscall.O_EXCL|syscall.O_WRONLY,
|
||||||
|
0400,
|
||||||
|
); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if src, err = os.Open(
|
||||||
|
iana.Append(name).String(),
|
||||||
|
); err != nil {
|
||||||
|
_ = dst.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.CopyBuffer(dst, src, buf)
|
||||||
|
closeErrs := [...]error{
|
||||||
|
dst.Close(),
|
||||||
|
src.Close(),
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
} else if err = errors.Join(closeErrs[:]...); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return os.Chmod(etc.String(), 0500)
|
return os.Chmod(etc.String(), 0500)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,8 +89,27 @@ func (cureEtc) Kind() pkg.Kind { return kindEtc }
|
|||||||
// Params is a noop.
|
// Params is a noop.
|
||||||
func (cureEtc) Params(*pkg.IContext) {}
|
func (cureEtc) Params(*pkg.IContext) {}
|
||||||
|
|
||||||
// Dependencies returns a nil slice.
|
// Dependencies returns a slice containing the backing iana-etc release.
|
||||||
func (cureEtc) Dependencies() []pkg.Artifact { return nil }
|
func (a cureEtc) Dependencies() []pkg.Artifact {
|
||||||
|
if a.iana != nil {
|
||||||
|
return []pkg.Artifact{a.iana}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// String returns a hardcoded reporting name.
|
// String returns a hardcoded reporting name.
|
||||||
func (cureEtc) String() string { return "cure-etc" }
|
func (cureEtc) String() string { return "cure-etc" }
|
||||||
|
|
||||||
|
// newIANAEtc returns an unpacked iana-etc release.
|
||||||
|
func newIANAEtc() pkg.Artifact {
|
||||||
|
const (
|
||||||
|
version = "20251215"
|
||||||
|
checksum = "kvKz0gW_rGG5QaNK9ZWmWu1IEgYAdmhj_wR7DYrh3axDfIql_clGRHmelP7525NJ"
|
||||||
|
)
|
||||||
|
return pkg.NewHTTPGetTar(
|
||||||
|
nil, "https://github.com/Mic92/iana-etc/releases/download/"+
|
||||||
|
version+"/iana-etc-"+version+".tar.gz",
|
||||||
|
mustDecode(checksum),
|
||||||
|
pkg.TarGzip,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ ln -vs ../usr/bin /work/bin
|
|||||||
boot := t - 1
|
boot := t - 1
|
||||||
musl, compilerRT, runtimes, clang := boot.NewLLVM()
|
musl, compilerRT, runtimes, clang := boot.NewLLVM()
|
||||||
support = slices.Concat([]pkg.Artifact{
|
support = slices.Concat([]pkg.Artifact{
|
||||||
cureEtc{},
|
cureEtc{newIANAEtc()},
|
||||||
musl,
|
musl,
|
||||||
compilerRT,
|
compilerRT,
|
||||||
runtimes,
|
runtimes,
|
||||||
|
|||||||
Reference in New Issue
Block a user