From 3b8d21e12106309e51998c9aeb5ff9791ae94870 Mon Sep 17 00:00:00 2001 From: Jan Klaban Date: Fri, 24 Jan 2025 11:18:45 +0100 Subject: [PATCH] error handling --- dlmsal/data.go | 52 +++++++++++++++++++++--------------- dlmsal/datastream.go | 7 ++--- dlmsal/dlmsal.go | 17 ++++++------ dlmsal/dlmsexception.go | 16 +++++------ dlmsal/dlmslnaction.go | 5 ++-- dlmsal/dlmslnget.go | 59 +++++++++++++++++++++-------------------- dlmsal/dlmslnset.go | 10 +++---- dlmsal/dlmssn.go | 26 +++++++++--------- gcm/gcmstream.go | 9 ++++--- hdlc/hdlc.go | 11 ++++---- tcp/tcp.go | 2 +- 11 files changed, 114 insertions(+), 100 deletions(-) diff --git a/dlmsal/data.go b/dlmsal/data.go index 585af35..f1b80d7 100644 --- a/dlmsal/data.go +++ b/dlmsal/data.go @@ -50,13 +50,21 @@ type DlmsData struct { } func NewDlmsDataError(err AccessResultTag) DlmsData { - return DlmsData{Tag: TagError, Value: DlmsError{Result: err}} + return DlmsData{Tag: TagError, Value: NewDlmsError(err)} } type DlmsError struct { Result AccessResultTag } +func (e *DlmsError) Error() string { + return fmt.Sprintf("dlms error: %s", e.Result) +} + +func NewDlmsError(result AccessResultTag) error { + return &DlmsError{Result: result} +} + type DlmsCompactArray struct { tag dataTag tags []dataTag @@ -100,7 +108,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:1]) if err != nil { - return data, 0, fmt.Errorf("too short data for boolean, %v", err) + return data, 0, fmt.Errorf("too short data for boolean, %w", err) } return DlmsData{Tag: tag, Value: tmpbuffer[0] != 0}, 1, nil } @@ -119,7 +127,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData } _, err = io.ReadFull(src, tmp) if err != nil { - return data, 0, fmt.Errorf("too short data for bitstring %v", err) + return data, 0, fmt.Errorf("too short data for bitstring %w", err) } val := make([]bool, l) off := uint(0) @@ -139,7 +147,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:4]) if err != nil { - return data, 0, fmt.Errorf("too short data for double long %v", err) + return data, 0, fmt.Errorf("too short data for double long %w", err) } v := int32(tmpbuffer[0])<<24 | int32(tmpbuffer[1])<<16 | int32(tmpbuffer[2])<<8 | int32(tmpbuffer[3]) return DlmsData{Tag: tag, Value: v}, 4, nil @@ -148,7 +156,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:4]) if err != nil { - return data, 0, fmt.Errorf("too short data for double long unsigned %v", err) + return data, 0, fmt.Errorf("too short data for double long unsigned %w", err) } v := uint32(tmpbuffer[0])<<24 | uint32(tmpbuffer[1])<<16 | uint32(tmpbuffer[2])<<8 | uint32(tmpbuffer[3]) return DlmsData{Tag: tag, Value: v}, 4, nil @@ -162,7 +170,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData v := make([]byte, l) _, err = io.ReadFull(src, v) if err != nil { - return data, 0, fmt.Errorf("too short data for octet string %v", err) + return data, 0, fmt.Errorf("too short data for octet string %w", err) } return DlmsData{Tag: tag, Value: v}, c + int(l), nil } @@ -175,7 +183,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData v := make([]byte, l) _, err = io.ReadFull(src, v) if err != nil { - return data, 0, fmt.Errorf("too short data for visible string %v", err) + return data, 0, fmt.Errorf("too short data for visible string %w", err) } return DlmsData{Tag: tag, Value: string(v)}, c + int(l), nil // double copy } @@ -201,7 +209,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:1]) if err != nil { - return data, 0, fmt.Errorf("too short data for bcd %v", err) + return data, 0, fmt.Errorf("too short data for bcd %w", err) } v := int(tmpbuffer[0]&0xf) + 10*(int(tmpbuffer[0]>>4)&7) if (tmpbuffer[0] & 0x80) != 0 { @@ -213,7 +221,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:1]) if err != nil { - return data, 0, fmt.Errorf("too short data for integer %v", err) + return data, 0, fmt.Errorf("too short data for integer %w", err) } v := int8(tmpbuffer[0]) return DlmsData{Tag: tag, Value: v}, 1, nil @@ -222,7 +230,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:2]) if err != nil { - return data, 0, fmt.Errorf("too short data for long %v", err) + return data, 0, fmt.Errorf("too short data for long %w", err) } v := int16(tmpbuffer[0])<<8 | int16(tmpbuffer[1]) return DlmsData{Tag: tag, Value: v}, 2, nil @@ -231,7 +239,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:1]) if err != nil { - return data, 0, fmt.Errorf("too short data for unsigned/enum %v", err) + return data, 0, fmt.Errorf("too short data for unsigned/enum %w", err) } v := uint8(tmpbuffer[0]) return DlmsData{Tag: tag, Value: v}, 1, nil @@ -240,7 +248,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:2]) if err != nil { - return data, 0, fmt.Errorf("too short data for long unsigned %v", err) + return data, 0, fmt.Errorf("too short data for long unsigned %w", err) } v := uint16(tmpbuffer[0])<<8 | uint16(tmpbuffer[1]) return DlmsData{Tag: tag, Value: v}, 2, nil @@ -249,7 +257,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { n, err := io.ReadFull(src, tmpbuffer[:1]) if err != nil { - return data, 0, fmt.Errorf("too short data for compact array %v", err) + return data, 0, fmt.Errorf("too short data for compact array %w", err) } ctag := dataTag(tmpbuffer[0]) var types []dataTag @@ -267,7 +275,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData } _, err = io.ReadFull(src, tmp) if err != nil { - return data, 0, fmt.Errorf("too short data for compact array (number of structure items), %v", err) + return data, 0, fmt.Errorf("too short data for compact array (number of structure items), %w", err) } types = make([]dataTag, l) for i := 0; i < int(l); i++ { @@ -285,7 +293,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData // length in bytes, then slice it and traverse through slice till there is something left l, c, err := decodelength(src, tmpbuffer) if err != nil { - return data, 0, fmt.Errorf("too short data for compact array (length) %v", err) + return data, 0, fmt.Errorf("too short data for compact array (length) %w", err) } n += c @@ -342,7 +350,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:8]) if err != nil { - return data, 0, fmt.Errorf("too short data for long64 %v", err) + return data, 0, fmt.Errorf("too short data for long64 %w", err) } v := int64(tmpbuffer[0])<<56 | int64(tmpbuffer[1])<<48 | int64(tmpbuffer[2])<<40 | int64(tmpbuffer[3])<<32 | int64(tmpbuffer[4])<<24 | int64(tmpbuffer[5])<<16 | int64(tmpbuffer[6])<<8 | int64(tmpbuffer[7]) return DlmsData{Tag: tag, Value: v}, 8, nil @@ -351,7 +359,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:8]) if err != nil { - return data, 0, fmt.Errorf("too short data for long64 unsigned %v", err) + return data, 0, fmt.Errorf("too short data for long64 unsigned %w", err) } v := uint64(tmpbuffer[0])<<56 | uint64(tmpbuffer[1])<<48 | uint64(tmpbuffer[2])<<40 | uint64(tmpbuffer[3])<<32 | uint64(tmpbuffer[4])<<24 | uint64(tmpbuffer[5])<<16 | uint64(tmpbuffer[6])<<8 | uint64(tmpbuffer[7]) return DlmsData{Tag: tag, Value: v}, 8, nil @@ -360,7 +368,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:4]) if err != nil { - return data, 0, fmt.Errorf("too short data for float32 %v", err) + return data, 0, fmt.Errorf("too short data for float32 %w", err) } return DlmsData{Tag: tag, Value: math.Float32frombits(binary.BigEndian.Uint32(tmpbuffer[:4]))}, 4, nil } @@ -368,7 +376,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:8]) if err != nil { - return data, 0, fmt.Errorf("too short data for float64 %v", err) + return data, 0, fmt.Errorf("too short data for float64 %w", err) } return DlmsData{Tag: tag, Value: math.Float64frombits(binary.BigEndian.Uint64(tmpbuffer[:8]))}, 8, nil } @@ -376,7 +384,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:12]) if err != nil { - return data, 0, fmt.Errorf("too short data for datetime %v", err) + return data, 0, fmt.Errorf("too short data for datetime %w", err) } v := DlmsDateTime{ Date: DlmsDate{ @@ -400,7 +408,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:5]) if err != nil { - return data, 0, fmt.Errorf("too short data for date %v", err) + return data, 0, fmt.Errorf("too short data for date %w", err) } v := DlmsDate{ Year: uint16(tmpbuffer[0])<<8 | uint16(tmpbuffer[1]), @@ -414,7 +422,7 @@ func decodeData(src io.Reader, tag dataTag, tmpbuffer *tmpbuffer) (data DlmsData { _, err = io.ReadFull(src, tmpbuffer[:4]) if err != nil { - return data, 0, fmt.Errorf("too short data for time %v", err) + return data, 0, fmt.Errorf("too short data for time %w", err) } v := DlmsTime{ Hour: tmpbuffer[0], diff --git a/dlmsal/datastream.go b/dlmsal/datastream.go index 6282f25..d925835 100644 --- a/dlmsal/datastream.go +++ b/dlmsal/datastream.go @@ -1,6 +1,7 @@ package dlmsal import ( + "errors" "fmt" "io" @@ -101,8 +102,8 @@ func (d *datastream) NextElement() (*DlmsDataStreamItem, error) { _, err := io.ReadFull(d.src, d.buffer[:1]) if err != nil { d.inerror = true - if err == io.EOF { - return nil, fmt.Errorf("unexpected EOF") + if errors.Is(err, io.EOF) { + return nil, io.ErrUnexpectedEOF } return nil, err } @@ -142,7 +143,7 @@ func (d *datastream) Close() error { // artifically read out the rest n, err := d.src.Read(rb) cnt += n if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { if d.logger != nil { d.logger.Debugf("data stream readout %v bytes", cnt) } diff --git a/dlmsal/dlmsal.go b/dlmsal/dlmsal.go index d453819..5b804f2 100644 --- a/dlmsal/dlmsal.go +++ b/dlmsal/dlmsal.go @@ -2,6 +2,7 @@ package dlmsal import ( "bytes" + "errors" "fmt" "io" @@ -66,9 +67,9 @@ type DlmsClient interface { Open() error SetLogger(logger *zap.SugaredLogger) Get(items []DlmsLNRequestItem) ([]DlmsData, error) - GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) + GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, error) Read(items []DlmsSNRequestItem) ([]DlmsData, error) - ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) // only for big single item queries + ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, error) // only for big single item queries Write(items []DlmsSNRequestItem) ([]AccessResultTag, error) Action(item DlmsLNRequestItem) (*DlmsData, error) Set(items []DlmsLNRequestItem) ([]AccessResultTag, error) @@ -266,10 +267,10 @@ func (d *dlmsal) smallreadout() ([]byte, error) { n, err := d.transport.Read(ret[total:]) total += n - if err == io.EOF { - return ret[:total], nil - } if err != nil { + if errors.Is(err, io.EOF) { + return ret[:total], nil + } return nil, err } } @@ -293,19 +294,19 @@ func (d *dlmsal) Open() error { // login and shits } aare, err := d.smallreadout() if err != nil { - return fmt.Errorf("unable to receive snrm: %v", err) + return fmt.Errorf("unable to receive snrm: %w", err) } // parse aare tag, _, data, err := decodetag(aare, &d.tmpbuffer) if err != nil { - return fmt.Errorf("unable to parse aare: %v", err) + return fmt.Errorf("unable to parse aare: %w", err) } if tag != byte(TagAARE) { return fmt.Errorf("unexpected tag: %x", tag) } tags, err := decodeaare(data, &d.tmpbuffer) if err != nil { - return fmt.Errorf("unable to parse aare: %v", err) + return fmt.Errorf("unable to parse aare: %w", err) } for _, dt := range tags { switch dt.tag { diff --git a/dlmsal/dlmsexception.go b/dlmsal/dlmsexception.go index c5acd3a..1937e7b 100644 --- a/dlmsal/dlmsexception.go +++ b/dlmsal/dlmsexception.go @@ -1,7 +1,7 @@ package dlmsal import ( - "fmt" + "errors" "io" ) @@ -11,15 +11,15 @@ func decodeException(src io.Reader, tmp *tmpbuffer) (e DlmsData, err error) { switch n { case 0: e = NewDlmsDataError(TagAccOtherReason) - case 1: - e = NewDlmsDataError(TagAccOtherReason) // not decoding state-error - case 2: - e = NewDlmsDataError(TagAccOtherReason) // not decoding service error + case 1, 2: + e = NewDlmsDataError(TagAccOtherReason) // not decoding state-error or service-error default: - err = fmt.Errorf("programatic error, unexpected read bytes count") + panic("programatic error, unexpected read bytes count") } - if err == io.EOF || err == io.ErrUnexpectedEOF { - err = nil + if err != nil { + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { + err = nil + } } return } diff --git a/dlmsal/dlmslnaction.go b/dlmsal/dlmslnaction.go index 070ea07..6f481c3 100644 --- a/dlmsal/dlmslnaction.go +++ b/dlmsal/dlmslnaction.go @@ -2,6 +2,7 @@ package dlmsal import ( "bytes" + "errors" "fmt" "io" @@ -30,7 +31,7 @@ func encodelnactionitem(dst *bytes.Buffer, item *DlmsLNRequestItem) error { dst.WriteByte(1) err := encodeData(dst, item.SetData) if err != nil { - return fmt.Errorf("unable to encode data: %v", err) + return fmt.Errorf("unable to encode data: %w", err) } } else { dst.WriteByte(0) @@ -100,7 +101,7 @@ func (ln *dlmsalaction) actiondata(tag CosemTag) (data *DlmsData, err error) { _, err = io.ReadFull(ln.transport, master.tmpbuffer[:1]) if err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { return nil, nil } return diff --git a/dlmsal/dlmslnget.go b/dlmsal/dlmslnget.go index 0362821..0bb2b53 100644 --- a/dlmsal/dlmslnget.go +++ b/dlmsal/dlmslnget.go @@ -2,6 +2,7 @@ package dlmsal import ( "bytes" + "errors" "fmt" "io" @@ -41,7 +42,7 @@ func encodelngetitem(dst *bytes.Buffer, item *DlmsLNRequestItem) error { dst.WriteByte(item.AccessDescriptor) err := encodeData(dst, item.AccessData) if err != nil { - return fmt.Errorf("unable to encode data: %v", err) + return fmt.Errorf("unable to encode data: %w", err) } } else { dst.WriteByte(0) @@ -99,7 +100,7 @@ func (ln *dlmsalget) get(items []DlmsLNRequestItem) ([]DlmsData, error) { return ln.data, nil } -func (ln *dlmsalget) getstream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) { +func (ln *dlmsalget) getstream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, error) { master := ln.master local := &master.pdu local.Reset() @@ -110,39 +111,39 @@ func (ln *dlmsalget) getstream(item DlmsLNRequestItem, inmem bool) (DlmsDataStre err := encodelngetitem(local, &item) if err != nil { - return nil, nil, err + return nil, err } // send itself, that could be fun, do that in one step for now tag, str, err := master.sendpdu() if err != nil { - return nil, nil, err + return nil, err } ln.transport = str return ln.getstreamdata(tag, inmem) } -func (ln *dlmsalget) getstreamdata(tag CosemTag, inmem bool) (s DlmsDataStream, e *DlmsError, err error) { +func (ln *dlmsalget) getstreamdata(tag CosemTag, inmem bool) (s DlmsDataStream, err error) { master := ln.master switch tag { case TagGetResponse: case TagExceptionResponse: // no lower layer readout d, err := decodeException(ln.transport, &master.tmpbuffer) if err != nil { - return nil, nil, err + return nil, err } - ex := d.Value.(DlmsError) - return nil, &ex, nil // dont decode exception pdu, maybe todo, should be 2 bytes + ex := d.Value.(*DlmsError) + return nil, ex // dont decode exception pdu, maybe todo, should be 2 bytes default: - return nil, nil, fmt.Errorf("unexpected tag: %02x", tag) + return nil, fmt.Errorf("unexpected tag: %02x", tag) } _, err = io.ReadFull(ln.transport, master.tmpbuffer[:2]) if err != nil { - return nil, nil, err + return nil, err } if master.tmpbuffer[1]&7 != master.invokeid { - return nil, nil, fmt.Errorf("unexpected invoke id") + return nil, fmt.Errorf("unexpected invoke id") } switch getResponseTag(master.tmpbuffer[0]) { @@ -150,34 +151,33 @@ func (ln *dlmsalget) getstreamdata(tag CosemTag, inmem bool) (s DlmsDataStream, // decode data themselves _, err = io.ReadFull(ln.transport, master.tmpbuffer[:1]) if err != nil { - return nil, nil, err + return nil, err } if master.tmpbuffer[0] != 0 { _, err = io.ReadFull(ln.transport, master.tmpbuffer[:1]) - if err == io.ErrUnexpectedEOF { - return nil, &DlmsError{Result: TagAccOtherReason}, nil // this kind of data cant be decoded, so that is why - } else { - if err != nil { - return nil, nil, err + if err != nil { + if errors.Is(err, io.ErrUnexpectedEOF) { + return nil, NewDlmsError(TagAccOtherReason) // this kind of data cant be decoded, so that is why } + return nil, err } - return nil, &DlmsError{Result: AccessResultTag(master.tmpbuffer[0])}, nil + return nil, NewDlmsError(AccessResultTag(master.tmpbuffer[0])) } str, err := newDataStream(ln.transport, inmem, master.logger) if err != nil { - return nil, nil, err + return nil, err } - return str, nil, nil + return str, nil case TagGetResponseWithDataBlock: // this is a bit of hell, read till eof from lower layer and then ask for next block and so on ln.state = 1 str, err := newDataStream(ln, inmem, master.logger) if err != nil { - return nil, nil, err + return nil, err } - return str, nil, nil + return str, nil } - return nil, nil, fmt.Errorf("unexpected response tag: %02x", master.tmpbuffer[0]) + return nil, fmt.Errorf("unexpected response tag: %02x", master.tmpbuffer[0]) } func (ln *dlmsalget) getnextdata(tag CosemTag, i int) (cont bool, err error) { @@ -218,12 +218,13 @@ func (ln *dlmsalget) getnextdata(tag CosemTag, i int) (cont bool, err error) { if master.tmpbuffer[0] != 0 { _, err = io.ReadFull(ln.transport, master.tmpbuffer[:1]) - if err == io.ErrUnexpectedEOF { - ln.data[i] = NewDlmsDataError(TagAccOtherReason) // this kind of data cant be decoded, so that is why - } else { - if err != nil { + if err != nil { + if errors.Is(err, io.ErrUnexpectedEOF) { + ln.data[i] = NewDlmsDataError(TagAccOtherReason) // this kind of data cant be decoded, so that is why + } else { return false, err } + } else { ln.data[i] = NewDlmsDataError(AccessResultTag(master.tmpbuffer[0])) } } else { @@ -406,9 +407,9 @@ func (d *dlmsal) Get(items []DlmsLNRequestItem) ([]DlmsData, error) { return ln.get(items) } -func (d *dlmsal) GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) { +func (d *dlmsal) GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, error) { if !d.isopen { - return nil, nil, base.ErrNotOpened + return nil, base.ErrNotOpened } ln := &dlmsalget{master: d, state: 0, blockexp: 0} diff --git a/dlmsal/dlmslnset.go b/dlmsal/dlmslnset.go index d60806e..e474211 100644 --- a/dlmsal/dlmslnset.go +++ b/dlmsal/dlmslnset.go @@ -17,7 +17,7 @@ func encodelnsetitem(dst *bytes.Buffer, item *DlmsLNRequestItem) error { dst.WriteByte(item.AccessDescriptor) err := encodeData(dst, item.AccessData) if err != nil { - return fmt.Errorf("unable to encode data: %v", err) + return fmt.Errorf("unable to encode data: %w", err) } } else { dst.WriteByte(0) @@ -92,7 +92,7 @@ func (al *dlmsal) setsingle(item DlmsLNRequestItem) ([]AccessResultTag, error) { if err != nil { return nil, err } - ret[0] = (d.Value.(DlmsError)).Result + ret[0] = (d.Value.(*DlmsError)).Result return ret, nil default: return nil, fmt.Errorf("unexpected tag: %02x", tag) @@ -148,7 +148,7 @@ func (al *dlmsal) setsingle(item DlmsLNRequestItem) ([]AccessResultTag, error) { if err != nil { return nil, err } - ret[0] = (d.Value.(DlmsError)).Result + ret[0] = (d.Value.(*DlmsError)).Result return ret, nil default: return nil, fmt.Errorf("unexpected tag: %02x", tag) @@ -260,7 +260,7 @@ func (al *dlmsal) Set(items []DlmsLNRequestItem) (ret []AccessResultTag, err err return nil, err } for i := 0; i < len(items); i++ { - ret[i] = (d.Value.(DlmsError)).Result + ret[i] = (d.Value.(*DlmsError)).Result } return ret, nil default: @@ -337,7 +337,7 @@ func (al *dlmsal) Set(items []DlmsLNRequestItem) (ret []AccessResultTag, err err return nil, err } for i := 0; i < len(items); i++ { - ret[i] = (d.Value.(DlmsError)).Result + ret[i] = (d.Value.(*DlmsError)).Result } return ret, nil default: diff --git a/dlmsal/dlmssn.go b/dlmsal/dlmssn.go index c7e1231..37971d3 100644 --- a/dlmsal/dlmssn.go +++ b/dlmsal/dlmssn.go @@ -80,9 +80,9 @@ func (d *dlmsal) Read(items []DlmsSNRequestItem) ([]DlmsData, error) { return ret, nil } -func (d *dlmsal) ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) { +func (d *dlmsal) ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, error) { if !d.isopen { - return nil, nil, base.ErrNotOpened + return nil, base.ErrNotOpened } local := &d.pdu @@ -97,7 +97,7 @@ func (d *dlmsal) ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, local.WriteByte(item.AccessDescriptor) err := encodeData(local, item.AccessData) if err != nil { - return nil, nil, err + return nil, err } } else { local.WriteByte(2) @@ -107,40 +107,40 @@ func (d *dlmsal) ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, tag, str, err := d.sendpdu() if err != nil { - return nil, nil, err + return nil, err } if tag != TagReadResponse { - return nil, nil, fmt.Errorf("unexpected tag: %x", tag) + return nil, fmt.Errorf("unexpected tag: %x", tag) } l, _, err := decodelength(str, &d.tmpbuffer) if err != nil { - return nil, nil, err + return nil, err } if l != 1 { - return nil, nil, fmt.Errorf("only one item was expected") + return nil, fmt.Errorf("only one item was expected") } _, err = io.ReadFull(str, d.tmpbuffer[:1]) if err != nil { - return nil, nil, err + return nil, err } switch d.tmpbuffer[0] { case 0: str, err := newDataStream(str, inmem, d.logger) if err != nil { - return nil, nil, err + return nil, err } - return str, nil, nil + return str, nil case 1: _, err = io.ReadFull(str, d.tmpbuffer[:1]) if err != nil { - return nil, nil, err + return nil, err } - return nil, &DlmsError{Result: AccessResultTag(d.tmpbuffer[0])}, nil + return nil, NewDlmsError(AccessResultTag(d.tmpbuffer[0])) } - return nil, nil, fmt.Errorf("unexpected response tag: %x", d.tmpbuffer[0]) + return nil, fmt.Errorf("unexpected response tag: %x", d.tmpbuffer[0]) } // write support here diff --git a/gcm/gcmstream.go b/gcm/gcmstream.go index 27f2f1e..e3476e1 100644 --- a/gcm/gcmstream.go +++ b/gcm/gcmstream.go @@ -3,6 +3,7 @@ package gcm import ( "bytes" "encoding/binary" + "errors" "fmt" "io" @@ -58,7 +59,7 @@ func (g *gcmdecstream10) Read(p []byte) (n int, err error) { copy(g.block[:], g.block[g.blockoffer:g.blockread]) n, err = io.ReadFull(g.apdu, g.block[g.blockread-g.blockoffer:]) if err != nil { - if err == io.ErrUnexpectedEOF || err == io.EOF { + if errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) { g.ineof = true } else { // dont process anything more return 0, err @@ -69,7 +70,7 @@ func (g *gcmdecstream10) Read(p []byte) (n int, err error) { } else { // first round, but handle whole sc+ak + maybe something n, err = io.ReadFull(g.apdu, g.block[g.blockwrite:]) if err != nil { - if err == io.ErrUnexpectedEOF || err == io.EOF { + if errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) { if n < GCM_TAG_LENGTH { return 0, fmt.Errorf("gcm: too short data, no space for tag") } @@ -165,7 +166,7 @@ func (g *gcmdecstream20) Read(p []byte) (n int, err error) { g.blockread, err = io.ReadFull(g.apdu, g.block[:]) g.blockoffset = 0 if err != nil { - if err == io.ErrUnexpectedEOF || err == io.EOF { + if errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) { g.ineof = true if g.blockread == 0 { return 0, io.EOF @@ -227,7 +228,7 @@ func (g *gcmdecstream30) Read(p []byte) (n int, err error) { copy(g.block[:], g.block[g.blockoffer:g.blockread]) n, err = io.ReadFull(g.apdu, g.block[g.blockread-g.blockoffer:]) if err != nil { - if err == io.ErrUnexpectedEOF || err == io.EOF { + if errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) { g.ineof = true } else { // dont process anything more return 0, err diff --git a/hdlc/hdlc.go b/hdlc/hdlc.go index a5c77d4..d323796 100644 --- a/hdlc/hdlc.go +++ b/hdlc/hdlc.go @@ -1,6 +1,7 @@ package hdlc import ( + "errors" "fmt" "io" "time" @@ -458,12 +459,12 @@ func (w *maclayer) readout() error { for { n, err := w.Read(w.sendbuffer[:]) bcnt -= n - if err == io.EOF { - w.tosend = 0 - w.state = 1 - return nil - } if err != nil { + if errors.Is(err, io.EOF) { + w.tosend = 0 + w.state = 1 + return nil + } return err } if bcnt <= 0 { diff --git a/tcp/tcp.go b/tcp/tcp.go index d83d06b..b883bb4 100644 --- a/tcp/tcp.go +++ b/tcp/tcp.go @@ -64,7 +64,7 @@ func (t *tcp) Open() error { conn, err := net.DialTimeout("tcp", address, t.timeout) if err != nil { - t.logf("Connect to %s failed: %v", address, err) + t.logf("Connect to %s failed: %v", address, err.Error()) return fmt.Errorf("connect failed: %w", err) }