github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/cmds/core/mkdir/mkdir.go (about) 1 // Copyright 2012-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 // mkdir makes a new directory. 6 // 7 // Synopsis: 8 // mkdir [-m mode] [-v] [-p] DIRECTORY... 9 // 10 // Options: 11 // -m: make all needed directories in the path 12 // -v: directory mode (ex: 666) 13 // -p: print each directory as it is made 14 package main 15 16 import ( 17 "flag" 18 "fmt" 19 "log" 20 "os" 21 "strconv" 22 ) 23 24 const ( 25 cmd = "mkdir [-m mode] [-v] [-p] <directory> [more directories]" 26 DefaultCreationMode = 0777 27 StickyBit = 01000 28 SgidBit = 02000 29 SuidBit = 04000 30 ) 31 32 var ( 33 mode = flag.String("m", "", "Directory mode") 34 mkall = flag.Bool("p", false, "Make all needed directories in the path") 35 verbose = flag.Bool("v", false, "Print each directory as it is made") 36 f = os.Mkdir 37 ) 38 39 func init() { 40 // Usage Definition 41 defUsage := flag.Usage 42 flag.Usage = func() { 43 os.Args[0] = cmd 44 defUsage() 45 } 46 } 47 48 func main() { 49 flag.Parse() 50 if len(flag.Args()) < 1 { 51 flag.Usage() 52 os.Exit(1) 53 } 54 if *mkall { 55 f = os.MkdirAll 56 } 57 58 // Get Correct Creation Mode 59 var m uint64 60 var err error 61 if *mode == "" { 62 m = DefaultCreationMode 63 } else { 64 m, err = strconv.ParseUint(*mode, 8, 32) 65 if err != nil || m > 07777 { 66 log.Fatalf("invalid mode '%s'", *mode) 67 } 68 } 69 createMode := os.FileMode(m) 70 if m&StickyBit != 0 { 71 createMode |= os.ModeSticky 72 } 73 if m&SgidBit != 0 { 74 createMode |= os.ModeSetgid 75 } 76 if m&SuidBit != 0 { 77 createMode |= os.ModeSetuid 78 } 79 80 for _, name := range flag.Args() { 81 if err := f(name, createMode); err != nil { 82 log.Printf("%v: %v\n", name, err) 83 continue 84 } 85 if *verbose { 86 fmt.Printf("%v\n", name) 87 } 88 if *mode != "" { 89 os.Chmod(name, createMode) 90 } 91 } 92 }