|
|
@@ -167,6 +167,52 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
|
return &value, err
|
|
|
}
|
|
|
|
|
|
+func Uname(uname *Utsname) error {
|
|
|
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
|
+ n := unsafe.Sizeof(uname.Sysname)
|
|
|
+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
|
+ n = unsafe.Sizeof(uname.Nodename)
|
|
|
+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
|
+ n = unsafe.Sizeof(uname.Release)
|
|
|
+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
|
+ n = unsafe.Sizeof(uname.Version)
|
|
|
+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // The version might have newlines or tabs in it, convert them to
|
|
|
+ // spaces.
|
|
|
+ for i, b := range uname.Version {
|
|
|
+ if b == '\n' || b == '\t' {
|
|
|
+ if i == len(uname.Version)-1 {
|
|
|
+ uname.Version[i] = 0
|
|
|
+ } else {
|
|
|
+ uname.Version[i] = ' '
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mib = []_C_int{CTL_HW, HW_MACHINE}
|
|
|
+ n = unsafe.Sizeof(uname.Machine)
|
|
|
+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Exposed directly
|
|
|
*/
|