Intermediate commit. Fixing how we close our channels and sockets and shut down our goroutines.
// Copyright 2011 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.packagemainimport("cjyar/xmpp""flag""fmt""log""os""time")// Demonstrate the API, and allow the user to interact with an XMPP// server via the terminal.funcmain(){varjidxmpp.JIDflag.Var(&jid,"jid","JID to log in as")varpw*string=flag.String("pw","","password")flag.Parse()ifjid.Domain==""||*pw==""{flag.Usage()os.Exit(2)}c,err:=xmpp.NewClient(&jid,*pw,nil)iferr!=nil{log.Fatalf("NewClient(%v): %v",jid,err)}deferclose(c.Out)err=c.StartSession(true,&xmpp.Presence{})iferr!=nil{log.Fatalf("StartSession: %v",err)}roster:=xmpp.Roster(c)fmt.Printf("%d roster entries:\n",len(roster))fori,entry:=range(roster){fmt.Printf("%d: %v\n",i,entry)}gofunc(ch<-chanxmpp.Stanza){forobj:=rangech{fmt.Printf("s: %v\n",obj)}fmt.Println("done reading")}(c.In)time.Sleep(1e9*5)fmt.Println("Shutting down.")close(c.Out)time.Sleep(1e9*5)select{}}