|
@@ -169,6 +169,69 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
|
return &value, err
|
|
return &value, err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
|
|
|
|
|
+ err := sysctl(mib, old, oldlen, nil, 0)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ // Utsname members on Dragonfly are only 32 bytes and
|
|
|
|
|
+ // the syscall returns ENOMEM in case the actual value
|
|
|
|
|
+ // is longer.
|
|
|
|
|
+ if err == ENOMEM {
|
|
|
|
|
+ err = nil
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return err
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func Uname(uname *Utsname) error {
|
|
|
|
|
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
|
|
|
|
+ n := unsafe.Sizeof(uname.Sysname)
|
|
|
|
|
+ if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0
|
|
|
|
|
+
|
|
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
|
|
|
|
|
+ n = unsafe.Sizeof(uname.Nodename)
|
|
|
|
|
+ if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0
|
|
|
|
|
+
|
|
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
|
|
|
|
|
+ n = unsafe.Sizeof(uname.Release)
|
|
|
|
|
+ if err := sysctlUname(mib, &uname.Release[0], &n); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ uname.Release[unsafe.Sizeof(uname.Release)-1] = 0
|
|
|
|
|
+
|
|
|
|
|
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
|
|
|
|
|
+ n = unsafe.Sizeof(uname.Version)
|
|
|
|
|
+ if err := sysctlUname(mib, &uname.Version[0], &n); 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 := sysctlUname(mib, &uname.Machine[0], &n); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0
|
|
|
|
|
+
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
* Exposed directly
|
|
* Exposed directly
|
|
|
*/
|
|
*/
|