1// +build !windows
2
3package exec
4
5import (
6	"os"
7	"os/exec"
8	"os/user"
9	"path/filepath"
10	"strconv"
11	"syscall"
12)
13
14func BuildCommand(command string) *exec.Cmd {
15	return exec.Command("/bin/sh", "-c", command)
16}
17
18func WritePipe(pipe string, contents []byte) {
19	handle, err := os.OpenFile(pipe, os.O_WRONLY, 0600)
20
21	if err != nil {
22		os.Remove(pipe)
23		log.Fatal(err)
24	}
25
26	handle.Write(contents)
27	handle.Close()
28}
29
30func GetPipe(dir string) string {
31	tmpfn := filepath.Join(dir, "tmp-file")
32	err := syscall.Mkfifo(tmpfn, 0600)
33	if err != nil {
34		log.Fatal(err)
35	}
36
37	return tmpfn
38}
39
40func SwitchUser(username string) {
41	user, err := user.Lookup(username)
42	if err != nil {
43		log.Fatal(err)
44	}
45
46	uid, _ := strconv.Atoi(user.Uid)
47
48	err = syscall.Setgid(uid)
49	if err != nil {
50		log.Fatal(err)
51	}
52
53	err = syscall.Setuid(uid)
54	if err != nil {
55		log.Fatal(err)
56	}
57
58	err = syscall.Setreuid(uid, uid)
59	if err != nil {
60		log.Fatal(err)
61	}
62
63	err = syscall.Setregid(uid, uid)
64	if err != nil {
65		log.Fatal(err)
66	}
67}
68