door_daemon_go cleanups
[svn42.git] / door_daemon_go / unix_socket_server.go
1 package main
2 import "fmt"
3 import "net"
4 import "bufio"
5
6 func readLineSafe(rw *bufio.ReadWriter) (string, error) {
7   wasPrefix:=false
8   var line string
9   for isPrefix:=true;isPrefix; {
10     var lineBuf []byte 
11     var err error
12     lineBuf,isPrefix,err = rw.ReadLine()
13     if err != nil {
14         return "",err
15     }
16     if isPrefix {
17       wasPrefix=true
18     } else {
19       line=string(lineBuf)
20     }
21   }
22   if wasPrefix {
23       fmt.Println("line too long")
24       fmt.Fprintf(rw,"line too long\n")
25       rw.Flush()
26       return "",nil
27   }
28   return line,nil
29 }
30
31 func connToReadWriter(c net.Conn) (*bufio.ReadWriter) {
32     client_r := bufio.NewReaderSize(c,14)
33     client_w := bufio.NewWriterSize(c,14)
34     return bufio.NewReadWriter(client_r,client_w)
35 }
36
37 func handleConnection(c net.Conn) () {
38     client:=connToReadWriter(c)
39     fmt.Println("new connection")
40     for {
41          line,err:=readLineSafe(client)
42          if err != nil {
43           fmt.Println(err.Error())
44           c.Close()
45           return
46          }
47          if line == "" {
48            continue
49          }
50          fmt.Printf("Received: %v\n", string(line))
51     }
52 }
53
54
55 func main() {
56   ln, err := net.Listen("unix", "/tmp/test.sock")
57   if err != nil {
58     fmt.Printf("Error: %s\n",err.Error())
59     return
60   }
61   fmt.Printf("Listener started\n")
62   for {
63     conn, err := ln.Accept()
64     if err != nil {
65       // handle error
66       continue
67     }
68     go handleConnection(conn)
69   }
70 }