| // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:ffi'; | |
| import 'dart:io'; | |
| import 'package:ffi/ffi.dart'; | |
| import 'third_party/unix.dart' as unix; | |
| import 'third_party/windows.dart' as windows; | |
| /// The machine's hostname. | |
| /// | |
| /// Returns `null` if looking up the machines host name fails. | |
| String? getHostName() => using((arena) { | |
| const maxHostNameLength = 256; | |
| final buffer = arena<Char>(maxHostNameLength); | |
| final result = Platform.isWindows | |
| ? windows.gethostname(buffer, maxHostNameLength) | |
| : unix.gethostname(buffer, maxHostNameLength); | |
| if (result != 0) { | |
| // The `errno` or `WSAGetLastError` are not preserved currently. | |
| // https://github.com/dart-lang/sdk/issues/38832 So, simply return null | |
| // instead of throwing an exception with the system error message. (A | |
| // possible workaround is to do the `errno` and `WSAGetLastError` in C | |
| // wrapper functions. However, this example project is meant to show an | |
| // example without compiling C code.) | |
| return null; | |
| } | |
| return buffer.cast<Utf8>().toDartString(); | |
| }); |