func (fw fileWrap) Close() error { f := fw.f f.fs.mu.Lock() defer f.fs.mu.Unlock() if !f.open { return ErrClosed } f.open = false f.fs.open-- err := fw.File.Close() if err != nil { f.fs.log(fmt.Sprintf("close %s.%d: %v", f.Type(), f.Num(), err)) } else { fdtrack.Close("leveldb") } return err }
func (t *udp) close() { close(t.closing) fdtrack.Close("p2p") t.conn.Close() // TODO: wait for the loops to end. }
func (n *Client) rpc(msg []byte, resultSize int) (result []byte, err error) { var server net.UDPAddr server.IP = n.gateway server.Port = nAT_PMP_PORT conn, err := net.DialUDP("udp", nil, &server) if err != nil { return } fdtrack.Open("natpmp") defer fdtrack.Close("natpmp") defer conn.Close() result = make([]byte, resultSize) needNewDeadline := true var tries uint for tries = 0; tries < nAT_TRIES; { if needNewDeadline { err = conn.SetDeadline(time.Now().Add((nAT_INITIAL_MS << tries) * time.Millisecond)) if err != nil { return } needNewDeadline = false } _, err = conn.Write(msg) if err != nil { return } var bytesRead int var remoteAddr *net.UDPAddr bytesRead, remoteAddr, err = conn.ReadFromUDP(result) if err != nil { if err.(net.Error).Timeout() { tries++ needNewDeadline = true continue } return } if !remoteAddr.IP.Equal(n.gateway) { log.Printf("Ignoring packet because IPs differ:", remoteAddr, n.gateway) // Ignore this packet. // Continue without increasing retransmission timeout or deadline. continue } if bytesRead != resultSize { err = fmt.Errorf("unexpected result size %d, expected %d", bytesRead, resultSize) return } if result[0] != 0 { err = fmt.Errorf("unknown protocol version %d", result[0]) return } expectedOp := msg[1] | 0x80 if result[1] != expectedOp { err = fmt.Errorf("Unexpected opcode %d. Expected %d", result[1], expectedOp) return } resultCode := readNetworkOrderUint16(result[2:4]) if resultCode != 0 { err = fmt.Errorf("Non-zero result code %d", resultCode) return } // If we got here the RPC is good. return } err = fmt.Errorf("Timed out trying to contact gateway") return }
// Close shuts down the client. The client will no longer be useful following // this. func (httpu *HTTPUClient) Close() error { httpu.connLock.Lock() defer httpu.connLock.Unlock() fdtrack.Close("upnp") return httpu.conn.Close() }