bine/control/cmd_conf.go

66 lines
1.5 KiB
Go

package control
import (
"strings"
"git.openprivacy.ca/openprivacy/bine/torutil"
)
// SetConf invokes SETCONF.
func (c *Conn) SetConf(entries ...*KeyVal) error {
return c.sendSetConf("SETCONF", entries)
}
// ResetConf invokes RESETCONF.
func (c *Conn) ResetConf(entries ...*KeyVal) error {
return c.sendSetConf("RESETCONF", entries)
}
func (c *Conn) sendSetConf(cmd string, entries []*KeyVal) error {
for _, entry := range entries {
cmd += " " + entry.Key
if entry.ValSet() {
cmd += "=" + torutil.EscapeSimpleQuotedStringIfNeeded(entry.Val)
}
}
return c.sendRequestIgnoreResponse(cmd)
}
// GetConf invokes GETCONF and returns the values for the requested keys.
func (c *Conn) GetConf(keys ...string) ([]*KeyVal, error) {
resp, err := c.SendRequest("GETCONF %v", strings.Join(keys, " "))
if err != nil {
return nil, err
}
data := resp.DataWithReply()
ret := make([]*KeyVal, 0, len(data))
for _, data := range data {
key, val, ok := torutil.PartitionString(data, '=')
entry := &KeyVal{Key: key}
if ok {
if entry.Val, err = torutil.UnescapeSimpleQuotedStringIfNeeded(val); err != nil {
return nil, err
}
if len(entry.Val) == 0 {
entry.ValSetAndEmpty = true
}
}
ret = append(ret, entry)
}
return ret, nil
}
// SaveConf invokes SAVECONF.
func (c *Conn) SaveConf(force bool) error {
cmd := "SAVECONF"
if force {
cmd += " FORCE"
}
return c.sendRequestIgnoreResponse(cmd)
}
// LoadConf invokes LOADCONF.
func (c *Conn) LoadConf(conf string) error {
return c.sendRequestIgnoreResponse("+LOADCONF\r\n%v\r\n.", conf)
}