gitlab.com/apertussolutions/u-root@v7.0.0+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  }