github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/cmds/uname/uname.go (about)

     1  // Copyright 2015-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  // Print build information about the kernel and machine.
     6  //
     7  // Synopsis:
     8  //     uname [-asnrvmd]
     9  //
    10  // Options:
    11  //     -a: print everything
    12  //     -s: print the kernel name
    13  //     -n: print the network node name
    14  //     -r: print the kernel release
    15  //     -v: print the kernel version
    16  //     -m: print the machine hardware name
    17  //     -d: print your domain name
    18  package main
    19  
    20  import (
    21  	"bytes"
    22  	"flag"
    23  	"fmt"
    24  	"log"
    25  	"strings"
    26  
    27  	"golang.org/x/sys/unix"
    28  )
    29  
    30  var (
    31  	all     = flag.Bool("a", false, "print everything")
    32  	kernel  = flag.Bool("s", false, "print the kernel name")
    33  	node    = flag.Bool("n", false, "print the network node name")
    34  	release = flag.Bool("r", false, "print the kernel release")
    35  	version = flag.Bool("v", false, "print the kernel version")
    36  	machine = flag.Bool("m", false, "print the machine hardware name")
    37  	domain  = flag.Bool("d", false, "print your domain name")
    38  )
    39  
    40  func toString(d []byte) string {
    41  	return string(d[:bytes.IndexByte(d[:], 0)])
    42  }
    43  
    44  func handleFlags(u *unix.Utsname) string {
    45  	Sysname, Nodename := toString(u.Sysname[:]), toString(u.Nodename[:])
    46  	Release, Version := toString(u.Release[:]), toString(u.Version[:])
    47  	Machine, Domainname := toString(u.Machine[:]), toString(u.Domainname[:])
    48  	info := make([]string, 0, 6)
    49  
    50  	if *all || flag.NFlag() == 0 {
    51  		info = append(info, Sysname, Nodename, Release, Version, Machine, Domainname)
    52  		goto end
    53  	}
    54  	if *kernel {
    55  		info = append(info, Sysname)
    56  	}
    57  	if *node {
    58  		info = append(info, Nodename)
    59  	}
    60  	if *release {
    61  		info = append(info, Release)
    62  	}
    63  	if *version {
    64  		info = append(info, Version)
    65  	}
    66  	if *machine {
    67  		info = append(info, Machine)
    68  	}
    69  	if *domain {
    70  		info = append(info, Domainname)
    71  	}
    72  
    73  end:
    74  	return strings.Join(info, " ")
    75  }
    76  
    77  func main() {
    78  	flag.Parse()
    79  
    80  	var u unix.Utsname
    81  	if err := unix.Uname(&u); err != nil {
    82  		log.Fatalf("%v", err)
    83  	}
    84  
    85  	info := handleFlags(&u)
    86  	fmt.Println(info)
    87  }