Better client panics.

This commit is contained in:
Mikkel Krautz 2011-04-30 22:15:02 +02:00
parent e00f910393
commit aad95834a2

View file

@ -115,9 +115,15 @@ func (client *Client) ShownName() string {
return client.Username return client.Username
} }
// Something invalid happened on the wire. // Log a panic and disconnect the client.
func (client *Client) Panic(reason string) { func (client *Client) Panic(v ...interface{}) {
client.Printf("panic: %v", reason) client.Print(v)
client.Disconnect()
}
// Log a formatted panic and disconnect the client.
func (client *Client) Panicf(format string, v ...interface{}) {
client.Printf(format, v)
client.Disconnect() client.Disconnect()
} }
@ -145,6 +151,8 @@ func (client *Client) disconnect(kicked bool) {
<-client.doneSending <-client.doneSending
close(client.msgchan) close(client.msgchan)
client.Printf("Disconnected")
client.conn.Close() client.conn.Close()
client.server.RemoveClient(client, kicked) client.server.RemoveClient(client, kicked)
} }
@ -185,21 +193,18 @@ func (client *Client) readProtoMessage() (msg *Message, err os.Error) {
// Read the message type (16-bit big-endian unsigned integer) // Read the message type (16-bit big-endian unsigned integer)
err = binary.Read(client.reader, binary.BigEndian, &kind) err = binary.Read(client.reader, binary.BigEndian, &kind)
if err != nil { if err != nil {
client.Panic("Unable to read packet kind")
return return
} }
// Read the message length (32-bit big-endian unsigned integer) // Read the message length (32-bit big-endian unsigned integer)
err = binary.Read(client.reader, binary.BigEndian, &length) err = binary.Read(client.reader, binary.BigEndian, &length)
if err != nil { if err != nil {
client.Panic("Unable to read packet length")
return return
} }
buf := make([]byte, length) buf := make([]byte, length)
_, err = io.ReadFull(client.reader, buf) _, err = io.ReadFull(client.reader, buf)
if err != nil { if err != nil {
client.Panic("Unable to read packet content")
return return
} }
@ -243,7 +248,7 @@ func (c *Client) sendPermissionDeniedTypeUser(kind string, user *Client) {
} }
d, err := proto.Marshal(pd) d, err := proto.Marshal(pd)
if err != nil { if err != nil {
c.Panic(err.String()) c.Panicf("%v", err)
return return
} }
c.msgchan <- &Message{ c.msgchan <- &Message{
@ -251,7 +256,7 @@ func (c *Client) sendPermissionDeniedTypeUser(kind string, user *Client) {
kind: MessagePermissionDenied, kind: MessagePermissionDenied,
} }
} else { } else {
c.Panic("Unknown permission denied type.") c.Panicf("Unknown permission denied type.")
} }
} }
@ -264,7 +269,7 @@ func (c *Client) sendPermissionDenied(who *Client, where *Channel, what Permissi
Type: mumbleproto.NewPermissionDenied_DenyType(mumbleproto.PermissionDenied_Permission), Type: mumbleproto.NewPermissionDenied_DenyType(mumbleproto.PermissionDenied_Permission),
}) })
if err != nil { if err != nil {
c.Panic(err.String()) c.Panicf(err.String())
} }
c.msgchan <- &Message{ c.msgchan <- &Message{
buf: d, buf: d,
@ -404,7 +409,7 @@ func (client *Client) sender() {
err := client.sendMessage(msg) err := client.sendMessage(msg)
if err != nil { if err != nil {
// fixme(mkrautz): This is a deadlock waiting to happen. // fixme(mkrautz): This is a deadlock waiting to happen.
client.Panic("Unable to send message to client") client.Panicf("Unable to send message to client")
return return
} }
} }
@ -420,10 +425,9 @@ func (client *Client) receiver() {
msg, err := client.readProtoMessage() msg, err := client.readProtoMessage()
if err != nil { if err != nil {
if err == os.EOF { if err == os.EOF {
client.Printf("Disconnected.")
client.Disconnect() client.Disconnect()
} else { } else {
client.Printf("Client error") client.Panicf("%v", err)
} }
return return
} }
@ -442,7 +446,11 @@ func (client *Client) receiver() {
// Try to read the next message in the pool // Try to read the next message in the pool
msg, err := client.readProtoMessage() msg, err := client.readProtoMessage()
if err != nil { if err != nil {
client.Panic(err.String()) if err == os.EOF {
client.Disconnect()
} else {
client.Panicf("%v", err)
}
return return
} }
@ -477,10 +485,9 @@ func (client *Client) receiver() {
msg, err := client.readProtoMessage() msg, err := client.readProtoMessage()
if err != nil { if err != nil {
if err == os.EOF { if err == os.EOF {
client.Printf("Disconnected")
client.Disconnect() client.Disconnect()
} else { } else {
client.Printf("Client error") client.Panicf("%v", err)
} }
return return
} }
@ -488,7 +495,7 @@ func (client *Client) receiver() {
version := &mumbleproto.Version{} version := &mumbleproto.Version{}
err = proto.Unmarshal(msg.buf, version) err = proto.Unmarshal(msg.buf, version)
if err != nil { if err != nil {
client.Panic("Unable to unmarshal client version packet.") client.Panicf("%v", err)
return return
} }
@ -558,7 +565,7 @@ func (client *Client) sendChannelTree(channel *Channel) {
err := client.sendProtoMessage(MessageChannelState, chanstate) err := client.sendProtoMessage(MessageChannelState, chanstate)
if err != nil { if err != nil {
client.Panic(err.String()) client.Panicf("%v", err)
} }
for _, subchannel := range channel.children { for _, subchannel := range channel.children {