1313package unix
1414
1515import (
16+ "errors"
1617 "sync"
1718 "unsafe"
1819)
@@ -169,25 +170,26 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
169170func Uname (uname * Utsname ) error {
170171 mib := []_C_int {CTL_KERN , KERN_OSTYPE }
171172 n := unsafe .Sizeof (uname .Sysname )
172- if err := sysctl (mib , & uname .Sysname [0 ], & n , nil , 0 ); err != nil {
173+ // Suppress ENOMEM errors to be compatible with the C library __xuname() implementation.
174+ if err := sysctl (mib , & uname .Sysname [0 ], & n , nil , 0 ); err != nil && ! errors .Is (err , ENOMEM ) {
173175 return err
174176 }
175177
176178 mib = []_C_int {CTL_KERN , KERN_HOSTNAME }
177179 n = unsafe .Sizeof (uname .Nodename )
178- if err := sysctl (mib , & uname .Nodename [0 ], & n , nil , 0 ); err != nil {
180+ if err := sysctl (mib , & uname .Nodename [0 ], & n , nil , 0 ); err != nil && ! errors . Is ( err , ENOMEM ) {
179181 return err
180182 }
181183
182184 mib = []_C_int {CTL_KERN , KERN_OSRELEASE }
183185 n = unsafe .Sizeof (uname .Release )
184- if err := sysctl (mib , & uname .Release [0 ], & n , nil , 0 ); err != nil {
186+ if err := sysctl (mib , & uname .Release [0 ], & n , nil , 0 ); err != nil && ! errors . Is ( err , ENOMEM ) {
185187 return err
186188 }
187189
188190 mib = []_C_int {CTL_KERN , KERN_VERSION }
189191 n = unsafe .Sizeof (uname .Version )
190- if err := sysctl (mib , & uname .Version [0 ], & n , nil , 0 ); err != nil {
192+ if err := sysctl (mib , & uname .Version [0 ], & n , nil , 0 ); err != nil && ! errors . Is ( err , ENOMEM ) {
191193 return err
192194 }
193195
@@ -205,7 +207,7 @@ func Uname(uname *Utsname) error {
205207
206208 mib = []_C_int {CTL_HW , HW_MACHINE }
207209 n = unsafe .Sizeof (uname .Machine )
208- if err := sysctl (mib , & uname .Machine [0 ], & n , nil , 0 ); err != nil {
210+ if err := sysctl (mib , & uname .Machine [0 ], & n , nil , 0 ); err != nil && ! errors . Is ( err , ENOMEM ) {
209211 return err
210212 }
211213
0 commit comments