| 94 | } |
| 95 | |
| 96 | func cpFile(src, dst string) error { |
| 97 | sfi, err := os.Stat(src) |
| 98 | if err != nil { |
| 99 | return err |
| 100 | } |
| 101 | if !sfi.Mode().IsRegular() { |
| 102 | return fmt.Errorf("cpFile can't deal with non-regular file %s", src) |
| 103 | } |
| 104 | |
| 105 | dstDir := filepath.Dir(dst) |
| 106 | if err := os.MkdirAll(dstDir, 0755); err != nil { |
| 107 | return err |
| 108 | } |
| 109 | |
| 110 | df, err := os.Create(dst) |
| 111 | if err != nil { |
| 112 | return err |
| 113 | } |
| 114 | sf, err := os.Open(src) |
| 115 | if err != nil { |
| 116 | return err |
| 117 | } |
| 118 | defer sf.Close() |
| 119 | |
| 120 | n, err := io.Copy(df, sf) |
| 121 | if err == nil && n != sfi.Size() { |
| 122 | err = fmt.Errorf("copied wrong size for %s -> %s: copied %d; want %d", src, dst, n, sfi.Size()) |
| 123 | } |
| 124 | cerr := df.Close() |
| 125 | if err == nil { |
| 126 | err = cerr |
| 127 | } |
| 128 | return err |
| 129 | } |
| 130 | |
| 131 | func handleSignals(camliProc *os.Process) { |
| 132 | c := make(chan os.Signal, 1) |