// decodes an nntp message and writes it to a section of the file. func decodeMsg(c *nntp.Conn, f *file, groups []string, MsgId string) { var err error defer f.Done() err = findGroup(c, groups) if err != nil { putBroken(c) fmt.Fprintln(os.Stderr, "nntp error:", err) return } rc, err := c.GetMessage(MsgId) if err != nil { fmt.Fprintln(os.Stderr, "nntp error getting", MsgId, ":", err) if _, ok := err.(*textproto.Error); ok { putConn(c) } else { putBroken(c) } return } putConn(c) yread, err := yenc.NewPart(bytes.NewReader(rc)) if err != nil { fmt.Fprintln(os.Stderr, err) return } wr := f.WriterAt(yread.Begin) _, err = io.Copy(wr, yread) if err != nil { fmt.Fprintln(os.Stderr, err) } }
func findGroup(c *nntp.Conn, groups []string) error { var err error for _, g := range groups { err = c.SwitchGroup(g) if err == nil { return nil } } return err }
func putBroken(c *nntp.Conn) { c.Close() connMu.Lock() connNum-- connMu.Unlock() }