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 }