forked from rosa/hakurei
Compare commits
8 Commits
master
...
a5bbc771a1
| Author | SHA1 | Date | |
|---|---|---|---|
|
a5bbc771a1
|
|||
|
d8648304bb
|
|||
|
f7bfa9a6c2
|
|||
|
7035b4b598
|
|||
|
094b8400dd
|
|||
|
4652d921d8
|
|||
|
066213c245
|
|||
|
98832c21ee
|
@@ -143,8 +143,48 @@ type Complete struct{}
|
|||||||
// Error returns a hardcoded string that should never be displayed to the user.
|
// Error returns a hardcoded string that should never be displayed to the user.
|
||||||
func (Complete) Error() string { return "returning from roundtrip" }
|
func (Complete) Error() string { return "returning from roundtrip" }
|
||||||
|
|
||||||
|
// HandlerFunc handles [syscall.NetlinkMessage] and returns a non-nil error to
|
||||||
|
// discontinue the receiving of more messages.
|
||||||
|
type HandlerFunc func(resp []syscall.NetlinkMessage) error
|
||||||
|
|
||||||
|
// receive receives from a socket with specified flags until a non-nil error is
|
||||||
|
// returned by f. An error of type [Complete] is returned as nil.
|
||||||
|
func (c *conn) receive(
|
||||||
|
f HandlerFunc,
|
||||||
|
flags int,
|
||||||
|
) error {
|
||||||
|
for {
|
||||||
|
buf := c.buf
|
||||||
|
if n, _, err := syscall.Recvfrom(c.fd, buf, flags); err != nil {
|
||||||
|
return os.NewSyscallError("recvfrom", err)
|
||||||
|
} else if n < syscall.NLMSG_HDRLEN {
|
||||||
|
return syscall.EBADE
|
||||||
|
} else {
|
||||||
|
buf = buf[:n]
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := syscall.ParseNetlinkMessage(buf)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range resp {
|
||||||
|
header := &resp[i].Header
|
||||||
|
if header.Seq != c.seq || header.Pid != getpid() {
|
||||||
|
return &InconsistentError{*header, c.seq, getpid()}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err = f(resp); err != nil {
|
||||||
|
if err == (Complete{}) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Roundtrip sends the pending message and handles the reply.
|
// Roundtrip sends the pending message and handles the reply.
|
||||||
func (c *conn) Roundtrip(f func(msg *syscall.NetlinkMessage) error) error {
|
func (c *conn) Roundtrip(f HandlerFunc) error {
|
||||||
if c.buf == nil {
|
if c.buf == nil {
|
||||||
return syscall.EINVAL
|
return syscall.EINVAL
|
||||||
}
|
}
|
||||||
@@ -156,31 +196,5 @@ func (c *conn) Roundtrip(f func(msg *syscall.NetlinkMessage) error) error {
|
|||||||
return os.NewSyscallError("sendto", err)
|
return os.NewSyscallError("sendto", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
return c.receive(f, 0)
|
||||||
buf := c.buf
|
|
||||||
if n, _, err := syscall.Recvfrom(c.fd, buf, 0); err != nil {
|
|
||||||
return os.NewSyscallError("recvfrom", err)
|
|
||||||
} else if n < syscall.NLMSG_HDRLEN {
|
|
||||||
return syscall.EBADE
|
|
||||||
} else {
|
|
||||||
buf = buf[:n]
|
|
||||||
}
|
|
||||||
|
|
||||||
msgs, err := syscall.ParseNetlinkMessage(buf)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, msg := range msgs {
|
|
||||||
if msg.Header.Seq != c.seq || msg.Header.Pid != getpid() {
|
|
||||||
return &InconsistentError{msg.Header, c.seq, getpid()}
|
|
||||||
}
|
|
||||||
if err = f(&msg); err != nil {
|
|
||||||
if err == (Complete{}) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,23 +18,23 @@ func DialRoute() (*RouteConn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rtnlConsume consumes a message from rtnetlink.
|
// rtnlConsume consumes a message from rtnetlink.
|
||||||
func rtnlConsume(msg *syscall.NetlinkMessage) error {
|
func rtnlConsume(resp []syscall.NetlinkMessage) error {
|
||||||
switch msg.Header.Type {
|
for i := range resp {
|
||||||
|
switch resp[i].Header.Type {
|
||||||
case syscall.NLMSG_DONE:
|
case syscall.NLMSG_DONE:
|
||||||
return Complete{}
|
return Complete{}
|
||||||
|
|
||||||
case syscall.NLMSG_ERROR:
|
case syscall.NLMSG_ERROR:
|
||||||
if e := As[syscall.NlMsgerr](msg.Data); e != nil {
|
if e := As[syscall.NlMsgerr](resp[i].Data); e != nil {
|
||||||
if e.Error == 0 {
|
if e.Error == 0 {
|
||||||
return Complete{}
|
return Complete{}
|
||||||
}
|
}
|
||||||
return syscall.Errno(-e.Error)
|
return syscall.Errno(-e.Error)
|
||||||
}
|
}
|
||||||
return syscall.EBADE
|
return syscall.EBADE
|
||||||
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InAddr is equivalent to struct in_addr.
|
// InAddr is equivalent to struct in_addr.
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newCMake() (pkg.Artifact, string) {
|
func (t Toolchain) newCMake() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "4.2.3"
|
version = "4.3.0"
|
||||||
checksum = "Y4uYGnLrDQX78UdzH7fMzfok46Nt_1taDIHSmqgboU1yFi6f0iAXBDegMCu4eS-J"
|
checksum = "amBtnY2eGsEdlrB-cTRuOESBTsIqtyaxWlEKNlnp2EWLwAKWINjssilo4KXE6El9"
|
||||||
)
|
)
|
||||||
return t.NewPackage("cmake", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("cmake", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/Kitware/CMake/releases/download/"+
|
nil, "https://github.com/Kitware/CMake/releases/download/"+
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newFuse() (pkg.Artifact, string) {
|
func (t Toolchain) newFuse() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "3.18.1"
|
version = "3.18.2"
|
||||||
checksum = "COb-BgJRWXLbt9XUkNeuiroQizpMifXqxgieE1SlkMXhs_WGSyJStrmyewAw2hd6"
|
checksum = "iL-7b7eUtmlVSf5cSq0dzow3UiqSjBmzV3cI_ENPs1tXcHdktkG45j1V12h-4jZe"
|
||||||
)
|
)
|
||||||
return t.NewPackage("fuse", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("fuse", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/libfuse/libfuse/releases/download/"+
|
nil, "https://github.com/libfuse/libfuse/releases/download/"+
|
||||||
|
|||||||
@@ -135,7 +135,8 @@ sed -i \
|
|||||||
cmd/link/internal/`+runtime.GOARCH+`/obj.go
|
cmd/link/internal/`+runtime.GOARCH+`/obj.go
|
||||||
|
|
||||||
rm \
|
rm \
|
||||||
os/root_unix_test.go
|
os/root_unix_test.go \
|
||||||
|
net/smtp/smtp_test.go
|
||||||
`, go123,
|
`, go123,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newLibexpat() (pkg.Artifact, string) {
|
func (t Toolchain) newLibexpat() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.7.4"
|
version = "2.7.5"
|
||||||
checksum = "W6NI2FESBjrTqRPcvs15fK5c3nwF6f9RT8U-XHKQKblXVzJB3nt_ez5B5jO0ZVDG"
|
checksum = "vTRUjjg-qbHSXUBYKXgzVHkUO7UNyuhrkSYrE7ikApQm0g-OvQ8tspw4w55M-1Tp"
|
||||||
)
|
)
|
||||||
return t.NewPackage("libexpat", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("libexpat", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/libexpat/libexpat/releases/download/"+
|
nil, "https://github.com/libexpat/libexpat/releases/download/"+
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newQEMU() (pkg.Artifact, string) {
|
func (t Toolchain) newQEMU() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "10.2.1"
|
version = "10.2.2"
|
||||||
checksum = "rjLTSgHJd3X3Vgpxrsus_ZZiaYLiNix1YhcHaGbLd_odYixwZjCcAIt8CVQPJGdZ"
|
checksum = "uNzRxlrVoLWe-EmZmBp75SezymgE512iE5XN90Bl7wi6CjE_oQGQB-9ocs7E16QG"
|
||||||
)
|
)
|
||||||
return t.NewPackage("qemu", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("qemu", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://download.qemu.org/qemu-"+version+".tar.bz2",
|
nil, "https://download.qemu.org/qemu-"+version+".tar.bz2",
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newWayland() (pkg.Artifact, string) {
|
func (t Toolchain) newWayland() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.24.91"
|
version = "1.25.0"
|
||||||
checksum = "SQkjYShk2TutoBOfmeJcdLU9iDExVKOg0DZhLeL8U_qjc9olLTC7h3vuUBvVtx9w"
|
checksum = "q-4dYXme46JPgLGtXAxyZGTy7udll9RfT0VXtcW2YRR1WWViUhvdZXZneXzLqpCg"
|
||||||
)
|
)
|
||||||
return t.NewPackage("wayland", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("wayland", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://gitlab.freedesktop.org/wayland/wayland/"+
|
nil, "https://gitlab.freedesktop.org/wayland/wayland/"+
|
||||||
|
|||||||
Reference in New Issue
Block a user