github.com/system-transparency/u-root@v6.0.1-0.20190919065413-ed07a650de4c+incompatible/cmds/core/chmod/chmod.go (about) 1 // Copyright 2016-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 // Change modifier bits of a file. 6 // 7 // Synopsis: 8 // chmod MODE FILE... 9 // 10 // Desription: 11 // MODE is a three character octal value. 12 package main 13 14 import ( 15 "flag" 16 "fmt" 17 "log" 18 "os" 19 "path/filepath" 20 "strconv" 21 ) 22 23 var ( 24 recursive bool 25 reference string 26 ) 27 28 func init() { 29 flag.BoolVar(&recursive, 30 "R", 31 false, 32 "do changes recursively") 33 34 flag.BoolVar(&recursive, 35 "recursive", 36 false, 37 "do changes recursively") 38 39 flag.StringVar(&reference, 40 "reference", 41 "", 42 "use mode from reference file") 43 } 44 45 func main() { 46 flag.Parse() 47 if len(flag.Args()) < 1 { 48 fmt.Fprintf(os.Stderr, "Usage of %s: [mode] filepath\n", os.Args[0]) 49 flag.PrintDefaults() 50 os.Exit(1) 51 } 52 53 if len(flag.Args()) < 2 && reference == "" { 54 fmt.Fprintf(os.Stderr, "Usage of %s: [mode] filepath\n", os.Args[0]) 55 flag.PrintDefaults() 56 os.Exit(1) 57 } 58 59 var mode os.FileMode 60 var fileList []string 61 62 if reference != "" { 63 fi, err := os.Stat(reference) 64 if err != nil { 65 log.Fatalf("bad reference file: %v", err) 66 67 } 68 mode = fi.Mode() 69 fileList = flag.Args() 70 } else { 71 modeString := flag.Args()[0] 72 octval, err := strconv.ParseUint(modeString, 8, 32) 73 if err != nil { 74 log.Fatalf("Unable to decode mode %q. Please use an octal value: %v", modeString, err) 75 } else if octval > 0777 { 76 log.Fatalf("Invalid octal value %0o. Value should be less than or equal to 0777.", octval) 77 } 78 mode = os.FileMode(octval) 79 fileList = flag.Args()[1:] 80 } 81 82 var exitError bool 83 for _, name := range fileList { 84 if recursive { 85 err := filepath.Walk(name, func(path string, 86 info os.FileInfo, 87 err error) error { 88 return os.Chmod(path, mode) 89 }) 90 if err != nil { 91 log.Printf("%v", err) 92 exitError = true 93 } 94 } else { 95 if err := os.Chmod(name, mode); err != nil { 96 log.Printf("%v", err) 97 exitError = true 98 } 99 } 100 } 101 if exitError { 102 os.Exit(1) 103 } 104 }