bine/control/cmd_misc.go

92 lines
2.4 KiB
Go

package control
import (
"git.openprivacy.ca/openprivacy/bine/torutil"
"strings"
)
// Signal invokes SIGNAL.
func (c *Conn) Signal(signal string) error {
return c.sendRequestIgnoreResponse("SIGNAL %v", signal)
}
// Quit invokes QUIT.
func (c *Conn) Quit() error {
return c.sendRequestIgnoreResponse("QUIT")
}
// MapAddresses invokes MAPADDRESS and returns mapped addresses.
func (c *Conn) MapAddresses(addresses ...*KeyVal) ([]*KeyVal, error) {
cmd := "MAPADDRESS"
for _, address := range addresses {
cmd += " " + address.Key + "=" + address.Val
}
resp, err := c.SendRequest(cmd)
if err != nil {
return nil, err
}
data := resp.DataWithReply()
ret := make([]*KeyVal, 0, len(data))
for _, address := range data {
mappedAddress := &KeyVal{}
mappedAddress.Key, mappedAddress.Val, _ = torutil.PartitionString(address, '=')
ret = append(ret, mappedAddress)
}
return ret, nil
}
// GetInfo invokes GETINTO and returns values for requested keys.
func (c *Conn) GetInfo(keys ...string) ([]*KeyVal, error) {
resp, err := c.SendRequest("GETINFO %v", strings.Join(keys, " "))
if err != nil {
return nil, err
}
ret := make([]*KeyVal, 0, len(resp.Data))
for _, val := range resp.Data {
infoVal := &KeyVal{}
infoVal.Key, infoVal.Val, _ = torutil.PartitionString(val, '=')
if infoVal.Val, err = torutil.UnescapeSimpleQuotedStringIfNeeded(infoVal.Val); err != nil {
return nil, err
}
ret = append(ret, infoVal)
}
return ret, nil
}
// PostDescriptor invokes POSTDESCRIPTOR.
func (c *Conn) PostDescriptor(descriptor string, purpose string, cache string) error {
cmd := "+POSTDESCRIPTOR"
if purpose != "" {
cmd += " purpose=" + purpose
}
if cache != "" {
cmd += " cache=" + cache
}
cmd += "\r\n" + descriptor + "\r\n."
return c.sendRequestIgnoreResponse(cmd)
}
// UseFeatures invokes USEFEATURE.
func (c *Conn) UseFeatures(features ...string) error {
return c.sendRequestIgnoreResponse("USEFEATURE " + strings.Join(features, " "))
}
// ResolveAsync invokes RESOLVE.
func (c *Conn) ResolveAsync(address string, reverse bool) error {
cmd := "RESOLVE "
if reverse {
cmd += "mode=reverse "
}
return c.sendRequestIgnoreResponse(cmd + address)
}
// TakeOwnership invokes TAKEOWNERSHIP.
func (c *Conn) TakeOwnership() error {
return c.sendRequestIgnoreResponse("TAKEOWNERSHIP")
}
// DropGuards invokes DROPGUARDS.
func (c *Conn) DropGuards() error {
return c.sendRequestIgnoreResponse("DROPGUARDS")
}