1package shell
2
3import (
4 "context"
5
6 "github.com/u-root/u-root/pkg/core"
7 "github.com/u-root/u-root/pkg/core/cat"
8 "github.com/u-root/u-root/pkg/core/chmod"
9 "github.com/u-root/u-root/pkg/core/cp"
10 "github.com/u-root/u-root/pkg/core/find"
11 "github.com/u-root/u-root/pkg/core/ls"
12 "github.com/u-root/u-root/pkg/core/mkdir"
13 "github.com/u-root/u-root/pkg/core/mv"
14 "github.com/u-root/u-root/pkg/core/rm"
15 "github.com/u-root/u-root/pkg/core/touch"
16 "github.com/u-root/u-root/pkg/core/xargs"
17 "mvdan.cc/sh/v3/interp"
18)
19
20var coreUtils = map[string]func() core.Command{
21 "cat": func() core.Command { return cat.New() },
22 "chmod": func() core.Command { return chmod.New() },
23 "cp": func() core.Command { return cp.New() },
24 "find": func() core.Command { return find.New() },
25 "ls": func() core.Command { return ls.New() },
26 "mkdir": func() core.Command { return mkdir.New() },
27 "mv": func() core.Command { return mv.New() },
28 "rm": func() core.Command { return rm.New() },
29 "touch": func() core.Command { return touch.New() },
30 "xargs": func() core.Command { return xargs.New() },
31}
32
33func (s *Shell) coreUtilsHandler() func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
34 return func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
35 return func(ctx context.Context, args []string) error {
36 if len(args) == 0 {
37 return next(ctx, args)
38 }
39
40 program, programArgs := args[0], args[1:]
41
42 newCoreUtil, ok := coreUtils[program]
43 if !ok {
44 return next(ctx, args)
45 }
46
47 c := interp.HandlerCtx(ctx)
48
49 cmd := newCoreUtil()
50 cmd.SetIO(c.Stdin, c.Stdout, c.Stderr)
51 cmd.SetWorkingDir(c.Dir)
52 cmd.SetLookupEnv(func(key string) (string, bool) {
53 v := c.Env.Get(key)
54 return v.Str, v.Set
55 })
56 return cmd.RunContext(ctx, programArgs...)
57 }
58 }
59}