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