Files
2024-11-01 17:43:06 +00:00

55 lines
1.2 KiB
Go

// Copyright ©2016 Dan Kortschak. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package wol provides a Wake On LAN function.
package wol
import (
"bytes"
"errors"
"io"
"net"
)
const magicLen = 6 + 16*6
// Wake sends a Wake On LAN magic packet for the given MAC address
// at the given remote address. If local is not nil, it is used as
// the local address for the connection to send on.
func Wake(mac net.HardwareAddr, pass []byte, local, remote *net.UDPAddr) error {
if len(mac) != 6 {
return errors.New("wol: bad MAC address")
}
switch len(pass) {
default:
return errors.New("wol: bad password length")
case 0, 6:
}
var magic [magicLen + 6]byte
copy(magic[:], []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff})
buf := bytes.NewBuffer(magic[:6])
for i := 0; i < 16; i++ {
buf.Write(mac)
}
buf.Write(pass)
if buf.Len() != magicLen+len(pass) {
panic("wol: unexpected packet length")
}
conn, err := net.DialUDP("udp", local, remote)
if err != nil {
return err
}
defer conn.Close()
n, err := conn.Write(buf.Bytes())
if err != nil {
return err
}
if n < magicLen+len(pass) {
return io.ErrShortWrite
}
return nil
}