func loadTable() error { if *tableFileName == "" { return nil } f, err := os.Open(*tableFileName) if os.IsNotExist(err) { return nil } if err != nil { return fmt.Errorf("error opening table file: %s", err) } defer f.Close() added := 0 for { b := make([]byte, krpc.CompactIPv4NodeInfoLen) _, err := io.ReadFull(f, b) if err == io.EOF { break } if err != nil { return fmt.Errorf("error reading table file: %s", err) } var ni krpc.NodeInfo err = ni.UnmarshalCompactIPv4(b) if err != nil { return fmt.Errorf("error unmarshaling compact node info: %s", err) } s.AddNode(ni) added++ } log.Printf("loaded %d nodes from table file", added) return nil }
func TestMarshalCompactNodeInfo(t *testing.T) { cni := krpc.NodeInfo{ ID: [20]byte{'a', 'b', 'c'}, } addr, err := net.ResolveUDPAddr("udp4", "1.2.3.4:5") require.NoError(t, err) cni.Addr = addr var b [krpc.CompactIPv4NodeInfoLen]byte err = cni.PutCompact(b[:]) require.NoError(t, err) var bb [26]byte copy(bb[:], []byte("abc")) copy(bb[20:], []byte("\x01\x02\x03\x04\x00\x05")) assert.EqualValues(t, bb, b) }