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  }