providers/darwin/machineid_darwin.go (28 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. //go:build (amd64 && cgo) || (arm64 && cgo) package darwin // #include <unistd.h> // #include <uuid/uuid.h> import "C" import ( "fmt" "unsafe" ) // MachineID returns the Hardware UUID also accessible via // About this Mac -> System Report and as the field // IOPlatformUUID in the output of "ioreg -d2 -c IOPlatformExpertDevice". func MachineID() (string, error) { return getHostUUID() } func getHostUUID() (string, error) { var uuidC C.uuid_t var id [unsafe.Sizeof(uuidC)]C.uchar wait := C.struct_timespec{5, 0} // 5 seconds ret, err := C.gethostuuid(&id[0], &wait) if ret != 0 { if err != nil { return "", fmt.Errorf("gethostuuid failed with %v: %w", ret, err) } return "", fmt.Errorf("gethostuuid failed with %v", ret) } var uuidStringC C.uuid_string_t var uuid [unsafe.Sizeof(uuidStringC)]C.char _, err = C.uuid_unparse_upper(&id[0], &uuid[0]) if err != nil { return "", fmt.Errorf("uuid_unparse_upper failed: %w", err) } return C.GoString(&uuid[0]), nil }