// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// The ogleproxy connects to the target binary and serves an RPC
// interface to access and control it.
package main

import (
	"flag"
	"fmt"
	"log"
	"net/rpc"
	"os"

	"code.google.com/p/ogle/program/server"
)

var (
	textFlag = flag.String("text", "", "file name of binary being debugged")
)

func main() {
	log.SetFlags(0)
	log.SetPrefix("ogleproxy: ")
	flag.Parse()
	if *textFlag == "" {
		fmt.Printf("OGLE BAD\nUsage")
		flag.Usage()
		os.Exit(2)
	}
	s, err := server.New(*textFlag)
	if err != nil {
		fmt.Printf("OGLE BAD\n%s\n", err)
		os.Exit(2)
	}
	err = rpc.Register(s)
	if err != nil {
		fmt.Printf("OGLE BAD\n%s\n", err)
		os.Exit(2)
	}
	fmt.Println("OGLE OK")
	log.Print("start server")
	// TODO: Usually done in a go.
	rpc.ServeConn(&rwc{
		os.Stdin,
		os.Stdout,
	})
	log.Print("finish server")
}

// rwc creates a single io.ReadWriteCloser from a read side and a write side.
// It allows us to do RPC using standard in and standard out.
type rwc struct {
	r *os.File
	w *os.File
}

func (rwc *rwc) Read(p []byte) (int, error) {
	return rwc.r.Read(p)
}

func (rwc *rwc) Write(p []byte) (int, error) {
	return rwc.w.Write(p)
}

func (rwc *rwc) Close() error {
	rerr := rwc.r.Close()
	werr := rwc.w.Close()
	if rerr != nil {
		return rerr
	}
	return werr
}
