github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/stdbin/write/write.go (about) 1 package main 2 3 import ( 4 "io" 5 "os" 6 "path/filepath" 7 ) 8 9 func toabs(path string) (string, error) { 10 if !filepath.IsAbs(path) { 11 wd, err := os.Getwd() 12 if err != nil { 13 return "", err 14 } 15 path = filepath.Join(wd, path) 16 } 17 return path, nil 18 } 19 20 func outfd(fname string) (io.WriteCloser, error) { 21 fname, err := toabs(fname) 22 if err != nil { 23 return nil, err 24 } 25 26 var out io.WriteCloser 27 28 out, ok := specialFile(fname) 29 if !ok { 30 f, err := os.OpenFile(fname, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) 31 if err != nil { 32 return nil, err 33 } 34 out = f 35 } 36 return out, nil 37 } 38 39 func write(fname string, in io.Reader) (err error) { 40 out, err := outfd(fname) 41 if err != nil { 42 return err 43 } 44 45 defer func() { 46 err2 := out.Close() 47 if err == nil { 48 err = err2 49 } 50 }() 51 52 _, err = io.Copy(out, in) 53 return err 54 }