diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-17 11:56:43 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-19 23:51:31 +0300 |
| commit | bd5339bff8bf5f5e877e94dfef265a22570a69c7 (patch) | |
| tree | 5902df7a9f21c00d9c414f6b0c2b79aadfd84752 /tmp | |
| parent | df935315c7201b7d42eb361b3ac3d36fe83e53e6 (diff) | |
first working version
Diffstat (limited to 'tmp')
| -rw-r--r-- | tmp/automap.go | 103 | ||||
| -rw-r--r-- | tmp/proto.go | 33 | ||||
| -rw-r--r-- | tmp/socket.go | 84 |
3 files changed, 220 insertions, 0 deletions
diff --git a/tmp/automap.go b/tmp/automap.go new file mode 100644 index 0000000..187960c --- /dev/null +++ b/tmp/automap.go @@ -0,0 +1,103 @@ +package server + +import ( + "strconv" + "sort" + "fmt" + "io" +) + +type autokey struct { + flag bool + n int + v string +} + +type automap map[string]interface{} + +type autokeys []autokey + +func (t autokey) String() string { + return t.v +} + +func (t autokeys) Len() int { + return len(t) +} + +func (t autokeys) Less(i, j int) bool { + a := &t[i] + b := &t[j] + + if a.flag && b.flag { + return a.n < b.n + } + + if !a.flag && !b.flag { + return a.v < b.v + } + + return b.flag +} + +func (t autokeys) Swap(i, j int) { + t[i], t[j] = t[j], t[i] +} + +func (m automap) add(v interface{}) { + for n := 1;; n++ { + k := fmt.Sprint(n) + if _, ok := m[k]; !ok { + m[k] = v + break + } + } +} + +func (m automap) del(k string) bool { + if _, ok := m[k]; !ok { + return false + } + + delete(m, k) + + return true +} + +func (m automap) rename(old string, new string) bool { + if _, ok := m[old]; !ok { + return false + } + + if _, ok := m[new]; ok { + return false + } + + m[new] = m[old] + + delete(m, old) + + return true +} + +func (m automap) show(w io.Writer) { + var keys autokeys + + for k, _ := range m { + t := autokey{v: k} + + n, err := strconv.Atoi(k) + if err == nil { + t.flag = true + t.n = n + } + + keys = append(keys, t) + } + + sort.Sort(keys) + + for _, k := range keys { + fmt.Fprintln(w, k, m[k.v]) + } +} diff --git a/tmp/proto.go b/tmp/proto.go new file mode 100644 index 0000000..104f1fa --- /dev/null +++ b/tmp/proto.go @@ -0,0 +1,33 @@ +package server + +type proto interface { + Open() (proto, error) + Close() error + String() string +} + +func protoShow(r *request) { + r.c.s.proto.show(r.out) +} + +func protoDel(r *request) { + r.expect(1) + + if !r.c.s.proto.del(r.args[0]) { + r.Fatal("no such proto") + } +} + +func protoRename(r *request) { + r.expect(2) + + if !r.c.s.proto.rename(r.args[0], r.args[1]) { + r.Fatal("rename failed") + } +} + +func init() { + newCmd(protoDel, "proto", "del") + newCmd(protoShow, "proto", "show") + newCmd(protoRename, "proto", "rename") +} diff --git a/tmp/socket.go b/tmp/socket.go new file mode 100644 index 0000000..febd650 --- /dev/null +++ b/tmp/socket.go @@ -0,0 +1,84 @@ +package server + +import ( + "strconv" + "fmt" +) + +const MAXPORT = 1 << 16 - 1 + +type tcpListen struct { + addr string +} + +type tcpOut struct { + addr string +} + +func (t *tcpListen) Open() (proto, error) { + return nil, errNotImplemented +} + +func (t *tcpListen) Close() error { + return nil +} + +func (t *tcpListen) String() string { + return fmt.Sprintf("tcp <- %s", t.addr) +} + +func (t *tcpOut) Open() (proto, error) { + return nil, errNotImplemented +} + +func (t *tcpOut) Close() error { + return nil +} + +func (t *tcpOut) String() string { + return fmt.Sprintf("tcp -> %s", t.addr) +} + +func parsePort(r *request, s string) int { + port, err := strconv.Atoi(s) + if err != nil { + r.Fatalf("bad port value: %v", err) + } + if port <= 0 || port > MAXPORT { + r.Fatal("bad port value") + } + return port +} + +func addTcpListen(r *request) { + r.expect(1, 2) + + var host string + var n int + + if r.argc > 1 { + host = r.args[n] + n++ + } + + port := parsePort(r, r.args[n]) + t := &tcpListen{addr: fmt.Sprintf("%s:%d", host, port)} + + r.c.s.proto.add(t) +} + +func addTcpOut(r *request) { + r.expect(2) + + host := r.args[0] + port := parsePort(r, r.args[1]) + + t := &tcpOut{addr: fmt.Sprintf("%s:%d", host, port)} + + r.c.s.proto.add(t) +} + +func init() { + newCmd(addTcpListen, "add", "tcp", "listen") + newCmd(addTcpOut, "add", "tcp", "out") +} |
