-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
acmexperiment.go
122 lines (109 loc) · 2.24 KB
/
acmexperiment.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"os"
"io"
"io/ioutil"
"fmt"
"strings"
"path/filepath"
"github.com/wendal/readline-go"
"github.com/lionkov/go9p/p"
"github.com/lionkov/go9p/p/clnt"
)
func makeP9Addr(name string) string {
ns := os.Getenv("NAMESPACE")
if ns == "" {
ns = fmt.Sprintf("/tmp/ns.%s.%s", os.Getenv("USER"), os.Getenv("DISPLAY"))
os.MkdirAll(ns, 0700)
}
return filepath.Join(ns, name)
}
func must(err error) {
if err != nil {
panic(err)
}
}
func main() {
user := p.OsUsers.Uid2User(os.Geteuid())
c, err := clnt.Mount("unix", makeP9Addr("acme"), "", user)
must(err)
defer c.Unmount()
ctlf, err := c.FOpen(fmt.Sprintf("/%s/ctl", os.Args[1]), p.OWRITE)
must(err)
addrf, err := c.FOpen(fmt.Sprintf("/%s/addr", os.Args[1]), p.ORDWR)
must(err)
dataf, err := c.FOpen(fmt.Sprintf("/%s/data", os.Args[1]), p.ORDWR)
must(err)
xdataf, err := c.FOpen(fmt.Sprintf("/%s/xdata", os.Args[1]), p.ORDWR)
must(err)
prompt := "> "
showAddr(addrf)
for {
line := readline.ReadLine(&prompt)
if line == nil {
return
}
v := strings.SplitN(*line, " ", 2)
cmd := v[0]
arg := ""
if len(v) > 1 {
arg = v[1]
}
switch cmd {
case "ctl":
if arg[len(arg)-1] != '\n' {
arg += "\n"
}
writeFile(ctlf, arg)
showAddr(addrf)
case "data":
writeFile(dataf, arg)
showAddr(addrf)
case "xdata":
writeFile(xdataf, arg)
showAddr(addrf)
case "rdata":
readFile(dataf)
showAddr(addrf)
case "rxdata":
readFile(xdataf)
showAddr(addrf)
case "addr":
arg = strings.TrimSpace(arg)
if arg != "" {
writeFile(addrf, arg)
}
showAddr(addrf)
case "exit":
os.Exit(0)
}
}
}
func writeFile(f io.WriteSeeker, s string) {
n, err := io.WriteString(f, s)
if err != nil {
fmt.Fprintf(os.Stderr, "write error (%d): %v\n", n, err)
}
f.Seek(0, 0)
}
func showAddr(f io.ReadSeeker) {
bs, err := ioutil.ReadAll(f)
if err != nil {
fmt.Fprintf(os.Stderr, "read error: %v\n", err)
return
}
f.Seek(0, 0)
fmt.Printf("addr = %s\n", string(bs))
}
func readFile(f io.ReadSeeker) {
bs, err := ioutil.ReadAll(f)
if err != nil {
fmt.Fprintf(os.Stderr, "read error: %v\n", err)
return
}
f.Seek(0, 0)
os.Stdout.Write(bs)
if len(bs) == 0 || bs[len(bs)-1] != '\n' {
os.Stdout.Write([]byte{ '\n' })
}
}