--- ui/xemu-os-utils-freebsd.c.orig 2026-07-19 21:17:55 UTC +++ ui/xemu-os-utils-freebsd.c @@ -0,0 +1,86 @@ +/* + * OS-specific Helpers + * + * Copyright (C) 2020-2021 Matt Borgerson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "xemu-os-utils.h" +#include +#include +#include +#include +#include + +static char *read_file_if_possible(const char *path) +{ + FILE *fd = fopen(path, "rb"); + if (fd == NULL) { + return NULL; + } + + fseek(fd, 0, SEEK_END); + size_t size = ftell(fd); + fseek(fd, 0, SEEK_SET); + + char *buf = malloc(size+1); + int status = fread(buf, 1, size, fd); + if (status != size) { + free(buf); + return NULL; + } + + buf[size] = '\x00'; + return buf; +} + +const char *xemu_get_os_info(void) +{ + static const char *os_info = NULL; + static int attempted_init = 0; + + if (!attempted_init) { + char *os_release = NULL; + + // Try to get the Linux distro "pretty name" from /etc/os-release + char *os_release_file = read_file_if_possible("/etc/os-release"); + if (os_release_file != NULL) { + char *pretty_name = strstr(os_release_file, "PRETTY_NAME=\""); + if (pretty_name != NULL) { + pretty_name = pretty_name + 13; + char *pretty_name_end = strchr(pretty_name, '"'); + if (pretty_name_end != NULL) { + size_t len = pretty_name_end-pretty_name; + os_release = malloc(len+1); + assert(os_release != NULL); + memcpy(os_release, pretty_name, len); + os_release[len] = '\x00'; + } + } + free(os_release_file); + } + + os_info = g_strdup_printf("%s", + os_release ? os_release : "Unknown Distro" + ); + if (os_release) { + free(os_release); + } + + attempted_init = 1; + } + + return os_info; +}