Robert Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 1 | // +build linux darwin |
| 2 | |
| 3 | package impl |
| 4 | |
| 5 | import ( |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 6 | "fmt" |
Robert Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 7 | "log" |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 8 | "os" |
Robert Kroeger | a99ad14 | 2014-10-30 17:56:39 -0700 | [diff] [blame] | 9 | "path/filepath" |
Robert Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 10 | "syscall" |
| 11 | ) |
| 12 | |
| 13 | // Chown is only availabe on UNIX platforms so this file has a build |
| 14 | // restriction. |
| 15 | func (hw *WorkParameters) Chown() error { |
Robert Kroeger | a99ad14 | 2014-10-30 17:56:39 -0700 | [diff] [blame] | 16 | chown := func(path string, _ os.FileInfo, inerr error) error { |
| 17 | if inerr != nil { |
| 18 | return inerr |
| 19 | } |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 20 | 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 Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 26 | |
Robert Kroeger | a99ad14 | 2014-10-30 17:56:39 -0700 | [diff] [blame] | 27 | for _, p := range []string{hw.workspace, hw.logDir} { |
Bogdan Caprita | 2b21936 | 2014-12-09 17:03:33 -0800 | [diff] [blame] | 28 | // TODO(rjkroege): Ensure that the device manager can read log entries. |
Robert Kroeger | a99ad14 | 2014-10-30 17:56:39 -0700 | [diff] [blame] | 29 | if err := filepath.Walk(p, chown); err != nil { |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 30 | return fmt.Errorf("os.Chown(%s, %d, %d) failed: %v", p, hw.uid, hw.gid, err) |
| 31 | } |
| 32 | } |
Robert Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 33 | return nil |
| 34 | } |
| 35 | |
| 36 | func (hw *WorkParameters) Exec() error { |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 37 | if hw.dryrun { |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 38 | log.Printf("[dryrun] syscall.Setgid(%d)", hw.gid) |
Robert Kroeger | 356fe81 | 2014-10-31 12:01:25 -0700 | [diff] [blame] | 39 | log.Printf("[dryrun] syscall.Setuid(%d)", hw.uid) |
Robert Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 40 | } else { |
Bogdan Caprita | 50c39d0 | 2014-12-17 16:48:53 -0800 | [diff] [blame] | 41 | // 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 Kroeger | 5dce7f5 | 2014-10-28 09:22:40 -0700 | [diff] [blame] | 51 | } |
Robert Kroeger | dd07b36 | 2014-09-18 17:34:42 -0700 | [diff] [blame] | 52 | return syscall.Exec(hw.argv0, hw.argv, hw.envv) |
| 53 | } |
Robert Kroeger | 9355055 | 2014-10-28 16:42:53 -0700 | [diff] [blame] | 54 | |
| 55 | func (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 | } |