// registerCallback registers a callback function to execute by // using c to parse the line. It appends the callback function // to the list of callback functions passed in by reference. func registerCallback(c *Controller, list *[]func() error) error { for c.Next() { args := c.RemainingArgs() if len(args) == 0 { return c.ArgErr() } nonblock := false if len(args) > 1 && args[len(args)-1] == "&" { // Run command in background; non-blocking nonblock = true args = args[:len(args)-1] } command, args, err := middleware.SplitCommandAndArgs(strings.Join(args, " ")) if err != nil { return c.Err(err.Error()) } fn := func() error { cmd := exec.Command(command, args...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if nonblock { return cmd.Start() } else { return cmd.Run() } } *list = append(*list, fn) } return nil }
func webSocketParse(c *Controller) ([]websockets.Config, error) { var websocks []websockets.Config var respawn bool optionalBlock := func() (hadBlock bool, err error) { for c.NextBlock() { hadBlock = true if c.Val() == "respawn" { respawn = true } else { return true, c.Err("Expected websocket configuration parameter in block") } } return } for c.Next() { var val, path, command string // Path or command; not sure which yet if !c.NextArg() { return nil, c.ArgErr() } val = c.Val() // Extra configuration may be in a block hadBlock, err := optionalBlock() if err != nil { return nil, err } if !hadBlock { // The next argument on this line will be the command or an open curly brace if c.NextArg() { path = val command = c.Val() } else { path = "/" command = val } // Okay, check again for optional block hadBlock, err = optionalBlock() if err != nil { return nil, err } } // Split command into the actual command and its arguments cmd, args, err := middleware.SplitCommandAndArgs(command) if err != nil { return nil, err } websocks = append(websocks, websockets.Config{ Path: path, Command: cmd, Arguments: args, Respawn: respawn, // TODO: This isn't used currently }) } return websocks, nil }