Merge pull request #10 from dropbox/return-codes
Return boolean success status from RunCommand*
S.Çağlar Onur
9 years ago
990 | 990 | // stdinfd: fd to read input from |
991 | 991 | // stdoutfd: fd to write output to |
992 | 992 | // stderrfd: fd to write error output to |
993 | func (c *Container) RunCommand(stdinfd, stdoutfd, stderrfd uintptr, args ...string) error { | |
994 | if args == nil { | |
995 | return ErrInsufficientNumberOfArguments | |
996 | } | |
997 | ||
998 | if err := c.makeSure(isDefined | isRunning); err != nil { | |
999 | return err | |
1000 | } | |
1001 | ||
1002 | c.mu.Lock() | |
1003 | defer c.mu.Unlock() | |
1004 | ||
1005 | cargs := makeNullTerminatedArgs(args) | |
1006 | if cargs == nil { | |
1007 | return ErrAllocationFailed | |
1008 | } | |
1009 | defer freeNullTerminatedArgs(cargs, len(args)) | |
1010 | ||
1011 | if int(C.go_lxc_attach_run_wait(c.container, false, C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs)) < 0 { | |
1012 | return ErrAttachFailed | |
1013 | } | |
1014 | return nil | |
993 | func (c *Container) RunCommand(stdinfd, stdoutfd, stderrfd uintptr, args ...string) (bool, error) { | |
994 | return c.runCommand(stdinfd, stdoutfd, stderrfd, false, args...) | |
1015 | 995 | } |
1016 | 996 | |
1017 | 997 | // RunCommandWithClearEnvironment runs the user specified command inside the container |
1019 | 999 | // stdinfd: fd to read input from |
1020 | 1000 | // stdoutfd: fd to write output to |
1021 | 1001 | // stderrfd: fd to write error output to |
1022 | func (c *Container) RunCommandWithClearEnvironment(stdinfd, stdoutfd, stderrfd uintptr, args ...string) error { | |
1002 | func (c *Container) RunCommandWithClearEnvironment(stdinfd, stdoutfd, stderrfd uintptr, args ...string) (bool, error) { | |
1003 | return c.runCommand(stdinfd, stdoutfd, stderrfd, true, args...) | |
1004 | } | |
1005 | ||
1006 | func (c *Container) runCommand(stdinfd, stdoutfd, stderrfd uintptr, clearenv bool, args ...string) (bool, error) { | |
1023 | 1007 | if args == nil { |
1024 | return ErrInsufficientNumberOfArguments | |
1025 | } | |
1026 | ||
1027 | if err := c.makeSure(isDefined | isRunning); err != nil { | |
1028 | return err | |
1008 | return false, ErrInsufficientNumberOfArguments | |
1009 | } | |
1010 | ||
1011 | if err := c.makeSure(isDefined | isRunning); err != nil { | |
1012 | return false, err | |
1029 | 1013 | } |
1030 | 1014 | |
1031 | 1015 | c.mu.Lock() |
1033 | 1017 | |
1034 | 1018 | cargs := makeNullTerminatedArgs(args) |
1035 | 1019 | if cargs == nil { |
1036 | return ErrAllocationFailed | |
1020 | return false, ErrAllocationFailed | |
1037 | 1021 | } |
1038 | 1022 | defer freeNullTerminatedArgs(cargs, len(args)) |
1039 | 1023 | |
1040 | if int(C.go_lxc_attach_run_wait(c.container, true, C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs)) < 0 { | |
1041 | return ErrAttachFailed | |
1042 | } | |
1043 | return nil | |
1024 | ret := int(C.go_lxc_attach_run_wait(c.container, C.bool(clearenv), C.int(stdinfd), C.int(stdoutfd), C.int(stderrfd), cargs)) | |
1025 | ||
1026 | if ret < 0 { | |
1027 | return false, ErrAttachFailed | |
1028 | } | |
1029 | return ret == 0, nil | |
1044 | 1030 | } |
1045 | 1031 | |
1046 | 1032 | // Interfaces returns the names of the network interfaces. |
56 | 56 | } |
57 | 57 | |
58 | 58 | log.Printf("RunCommandWithClearEnvironment\n") |
59 | if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil { | |
59 | if _, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil { | |
60 | 60 | log.Fatalf("ERROR: %s\n", err.Error()) |
61 | 61 | } |
62 | 62 | |
67 | 67 | } |
68 | 68 | |
69 | 69 | log.Printf("RunCommand\n") |
70 | if err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil { | |
70 | if _, err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), "uname", "-a"); err != nil { | |
71 | 71 | log.Fatalf("ERROR: %s\n", err.Error()) |
72 | 72 | } |
73 | 73 | } |
86 | 86 | } |
87 | 87 | |
88 | 88 | log.Printf("RunCommandWithClearEnvironment\n") |
89 | if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil { | |
89 | if _, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil { | |
90 | 90 | log.Fatalf("ERROR: %s\n", err.Error()) |
91 | 91 | } |
92 | 92 | } else { |
96 | 96 | } |
97 | 97 | |
98 | 98 | log.Printf("RunCommand\n") |
99 | if err := c.RunCommand(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil { | |
99 | if _, err := c.RunCommand(os.Stdin.Fd(), stdoutWriter.Fd(), stderrWriter.Fd(), "uname", "-a"); err != nil { | |
100 | 100 | log.Fatalf("ERROR: %s\n", err.Error()) |
101 | 101 | } |
102 | 102 | } |
932 | 932 | defer PutContainer(c) |
933 | 933 | |
934 | 934 | argsThree := []string{"/bin/sh", "-c", "/bin/ls -al > /dev/null"} |
935 | if err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...); err != nil { | |
936 | t.Errorf(err.Error()) | |
935 | ok, err := c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...) | |
936 | if err != nil { | |
937 | t.Errorf(err.Error()) | |
938 | } | |
939 | if ok != true { | |
940 | t.Errorf("Expected success") | |
941 | } | |
942 | ||
943 | argsThree = []string{"/bin/sh", "-c", "exit 1"} | |
944 | ok, err = c.RunCommand(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...) | |
945 | if err != nil { | |
946 | t.Errorf(err.Error()) | |
947 | } | |
948 | if ok != false { | |
949 | t.Errorf("Expected failure") | |
937 | 950 | } |
938 | 951 | } |
939 | 952 | |
945 | 958 | defer PutContainer(c) |
946 | 959 | |
947 | 960 | argsThree := []string{"/bin/sh", "-c", "/bin/ls -al > /dev/null"} |
948 | if err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...); err != nil { | |
949 | t.Errorf(err.Error()) | |
961 | ok, err := c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...) | |
962 | if err != nil { | |
963 | t.Errorf(err.Error()) | |
964 | } | |
965 | if ok != true { | |
966 | t.Errorf("Expected success") | |
967 | } | |
968 | ||
969 | argsThree = []string{"/bin/sh", "-c", "exit 1"} | |
970 | ok, err = c.RunCommandWithClearEnvironment(os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd(), argsThree...) | |
971 | if err != nil { | |
972 | t.Errorf(err.Error()) | |
973 | } | |
974 | if ok != false { | |
975 | t.Errorf("Expected failure") | |
950 | 976 | } |
951 | 977 | } |
952 | 978 |