added client to cmd dispatcher
[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 var cmdHandler = map[string]func([]string,string,*bufio.ReadWriter ) {
8   "test":handleCmdTest,
9 }
10
11
12 func readLineSafe(rw *bufio.ReadWriter) (string, error) {
13   wasPrefix:=false
14   var line string
15   for isPrefix:=true;isPrefix; {
16     var lineBuf []byte 
17     var err error
18     lineBuf,isPrefix,err = rw.ReadLine()
19     if err != nil {
20         return "",err
21     }
22     if isPrefix {
23       wasPrefix=true
24     } else {
25       line=string(lineBuf)
26     }
27   }
28   if wasPrefix {
29       fmt.Println("line too long")
30       fmt.Fprintf(rw,"line too long\n")
31       rw.Flush()
32       return "",nil
33   }
34   return line,nil
35 }
36
37 func connToReadWriter(c net.Conn) (*bufio.ReadWriter) {
38     client_r := bufio.NewReaderSize(c,14)
39     client_w := bufio.NewWriterSize(c,14)
40     return bufio.NewReadWriter(client_r,client_w)
41 }
42
43 func handleConnection(c net.Conn) () {
44     client:=connToReadWriter(c)
45     fmt.Println("new connection")
46     for {
47          line,err:=readLineSafe(client)
48          if err != nil {
49           if err.Error() != "EOF" {
50             fmt.Printf("Error: readLineSafe returned %v\n",err.Error())
51           } else {
52             fmt.Printf("Connection closed by remote host\n");
53           }
54           c.Close()
55           return
56          }
57          if line == "" {
58            continue
59          }
60          fmt.Printf("Received: %v\n", line)
61          tokens:=strings.Fields(line)
62          remainStr:=strings.Join(tokens[1:]," ")
63          handleCmd(tokens,remainStr,client)
64     }
65 }
66
67 func handleCmd(tokens []string, remainStr string,client * bufio.ReadWriter) {
68   cmd:=tokens[0]
69   func_ptr,present := cmdHandler[cmd]
70   if present {
71     func_ptr(tokens, remainStr,client)
72   } else {
73     fmt.Printf("Error: unknown Cmd: %v\n", cmd)
74   }
75 }
76
77 func handleCmdTest(tokens []string, remainStr string, client * bufio.ReadWriter) {
78   //cmd:=tokens[0]
79   fmt.Printf("Test: %v\n", remainStr)
80 }
81
82 func main() {
83   ln, err := net.Listen("unix", "/tmp/test.sock")
84   if err != nil {
85     fmt.Printf("Error: %s\n",err.Error())
86     return
87   }
88   fmt.Printf("Listener started\n")
89   for {
90     conn, err := ln.Accept()
91     if err != nil {
92       // handle error
93       continue
94     }
95     go handleConnection(conn)
96   }
97 }