github.com/mem/u-root@v2.0.1-0.20181004165302-9b18b4636a33+incompatible/cmds/readlink/readlink.go (about)

     1  // Copyright 2013-2017 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // readlink display value of symbolic link file.
     6  //
     7  // Synopsis:
     8  //     readlink [OPTIONS] FILE
     9  //
    10  // Options:
    11  //     -f: follow
    12  //     -v: verbose
    13  //
    14  package main
    15  
    16  import (
    17  	"flag"
    18  	"fmt"
    19  	"os"
    20  	"path/filepath"
    21  )
    22  
    23  const cmd = "readlink [-fv] FILE"
    24  
    25  var (
    26  	follow  = flag.Bool("f", false, "follow recursively")
    27  	verbose = flag.Bool("v", false, "report error messages")
    28  )
    29  
    30  func init() {
    31  	defUsage := flag.Usage
    32  	flag.Usage = func() {
    33  		os.Args[0] = cmd
    34  		defUsage()
    35  	}
    36  	flag.Parse()
    37  }
    38  
    39  func readLink(file string) error {
    40  	path, err := os.Readlink(file)
    41  	if err != nil {
    42  		return err
    43  	}
    44  
    45  	if *follow {
    46  		path, err = filepath.EvalSymlinks(file)
    47  	}
    48  
    49  	fmt.Printf("%s\n", path)
    50  	return err
    51  }
    52  
    53  func main() {
    54  	var exitStatus int
    55  
    56  	for _, file := range flag.Args() {
    57  		if err := readLink(file); err != nil {
    58  			if *verbose {
    59  				fmt.Fprintf(os.Stderr, "%v\n", err)
    60  			}
    61  			exitStatus = 1
    62  		}
    63  	}
    64  
    65  	os.Exit(exitStatus)
    66  }