blob: 60a7b92f19c99c2ee74e2e1bb0a25a34db125d08 [file] [log] [blame]
Robert Kroegerdd07b362014-09-18 17:34:42 -07001// +build linux darwin
2
3package impl
4
5import (
Robert Kroeger5dce7f52014-10-28 09:22:40 -07006 "fmt"
Robert Kroegerdd07b362014-09-18 17:34:42 -07007 "log"
Robert Kroeger5dce7f52014-10-28 09:22:40 -07008 "os"
Robert Kroegera99ad142014-10-30 17:56:39 -07009 "path/filepath"
Robert Kroegerdd07b362014-09-18 17:34:42 -070010 "syscall"
11)
12
13// Chown is only availabe on UNIX platforms so this file has a build
14// restriction.
15func (hw *WorkParameters) Chown() error {
Robert Kroegera99ad142014-10-30 17:56:39 -070016 chown := func(path string, _ os.FileInfo, inerr error) error {
17 if inerr != nil {
18 return inerr
19 }
Robert Kroeger5dce7f52014-10-28 09:22:40 -070020 if hw.dryrun {
21 log.Printf("[dryrun] os.Chown(%s, %d, %d)", path, hw.uid, hw.gid)
22 return nil
23 }
24 return os.Chown(path, hw.uid, hw.gid)
25 }
Robert Kroegerdd07b362014-09-18 17:34:42 -070026
Robert Kroegera99ad142014-10-30 17:56:39 -070027 for _, p := range []string{hw.workspace, hw.logDir} {
Bogdan Caprita2b219362014-12-09 17:03:33 -080028 // TODO(rjkroege): Ensure that the device manager can read log entries.
Robert Kroegera99ad142014-10-30 17:56:39 -070029 if err := filepath.Walk(p, chown); err != nil {
Robert Kroeger5dce7f52014-10-28 09:22:40 -070030 return fmt.Errorf("os.Chown(%s, %d, %d) failed: %v", p, hw.uid, hw.gid, err)
31 }
32 }
Robert Kroegerdd07b362014-09-18 17:34:42 -070033 return nil
34}
35
36func (hw *WorkParameters) Exec() error {
Robert Kroeger5dce7f52014-10-28 09:22:40 -070037 if hw.dryrun {
Robert Kroeger5dce7f52014-10-28 09:22:40 -070038 log.Printf("[dryrun] syscall.Setgid(%d)", hw.gid)
Robert Kroeger356fe812014-10-31 12:01:25 -070039 log.Printf("[dryrun] syscall.Setuid(%d)", hw.uid)
Robert Kroeger5dce7f52014-10-28 09:22:40 -070040 } else {
Bogdan Caprita50c39d02014-12-17 16:48:53 -080041 // NOTE(caprita): Commenting this out since it's broken with go
42 // 1.4, to make the integration test pass. go/vcl/8240 will fix
43 // it properly.
44
45 // if err := syscall.Setgid(hw.gid); err != nil {
46 // return fmt.Errorf("syscall.Setgid(%d) failed: %v", hw.gid, err)
47 // }
48 // if err := syscall.Setuid(hw.uid); err != nil {
49 // return fmt.Errorf("syscall.Setuid(%d) failed: %v", hw.uid, err)
50 // }
Robert Kroeger5dce7f52014-10-28 09:22:40 -070051 }
Robert Kroegerdd07b362014-09-18 17:34:42 -070052 return syscall.Exec(hw.argv0, hw.argv, hw.envv)
53}
Robert Kroeger93550552014-10-28 16:42:53 -070054
55func (hw *WorkParameters) Remove() error {
56 for _, p := range hw.argv {
57 if err := os.RemoveAll(p); err != nil {
58 return fmt.Errorf("os.RemoveAll(%s) failed: %v", p, err)
59 }
60 }
61 return nil
62}