blob: f3c3fce22857e011b2fb77edbf47bd43d8a8ca1e [file] [log] [blame]
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -07001package core
2
3import (
4 "fmt"
5 "io"
6 "os"
7
8 "veyron.io/veyron/veyron2/ipc"
9 "veyron.io/veyron/veyron2/naming"
10 "veyron.io/veyron/veyron2/rt"
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070011 "veyron.io/veyron/veyron2/security"
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070012
13 "veyron.io/veyron/veyron/lib/modules"
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070014 "veyron.io/veyron/veyron/profiles"
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070015)
16
17func init() {
18 modules.RegisterChild(EchoServerCommand, echoServer)
19 modules.RegisterChild(EchoClientCommand, echoClient)
20}
21
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070022type treeDispatcher struct{ id string }
23
24func (d treeDispatcher) Lookup(suffix, method string) (ipc.Invoker, security.Authorizer, error) {
25 return ipc.ReflectInvoker(&echoServerObject{d.id, suffix}), nil, nil
26}
27
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070028type echoServerObject struct {
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070029 id, suffix string
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070030}
31
32func (es *echoServerObject) Echo(call ipc.ServerCall, m string) (string, error) {
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070033 if len(es.suffix) > 0 {
34 return fmt.Sprintf("%s.%s: %s\n", es.id, es.suffix, m), nil
35 }
36 return fmt.Sprintf("%s: %s\n", es.id, m), nil
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070037}
38
39func echoServer(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
40 if len(args) != 2 {
41 return fmt.Errorf("wrong # args")
42 }
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070043 id, mp := args[0], args[1]
44 disp := &treeDispatcher{id: id}
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070045 server, err := rt.R().NewServer()
46 if err != nil {
47 return err
48 }
49 defer server.Stop()
Cosmos Nicolaoud6c3c9c2014-09-30 15:42:53 -070050 ep, err := server.ListenX(profiles.LocalListenSpec)
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070051 if err != nil {
52 return err
53 }
Cosmos Nicolaou9c9918d2014-09-23 08:45:56 -070054 if err := server.Serve(mp, disp); err != nil {
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070055 return err
56 }
57 fmt.Fprintf(stdout, "NAME=%s\n", naming.MakeTerminal(naming.JoinAddressName(ep.String(), "")))
58 fmt.Fprintf(stdout, "ADDR=%s\n", ep.String())
59 fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
60 modules.WaitForEOF(stdin)
61 return nil
62}
63
64func echoClient(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
Cosmos Nicolaou9ca249d2014-09-18 15:07:12 -070065 if len(args) < 2 {
66 return fmt.Errorf("wrong # args")
67 }
68 name := args[0]
69 args = args[1:]
70 client := rt.R().Client()
71 for _, a := range args {
72 ctxt := rt.R().NewContext()
73 h, err := client.StartCall(ctxt, name, "Echo", []interface{}{a})
74 if err != nil {
75 return err
76 }
77 var r string
78 var apperr error
79 if err := h.Finish(&r, &apperr); err != nil {
80 return err
81 } else {
82 if apperr != nil {
83 return apperr
84 }
85 }
86 fmt.Fprintf(stdout, r)
87 }
88 return nil
89}