4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync/* $Id$ */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync/** @file
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * IPRT - RTSystemQueryOSInfo, POSIX implementation.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2008-2010 Oracle Corporation
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync *
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * available from http://www.virtualbox.org. This file is free software;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * General Public License (GPL) as published by the Free Software
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync *
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * The contents of this file may alternatively be used under the terms
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * of the Common Development and Distribution License Version 1.0
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * CDDL are applicable instead of those of the GPL.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync *
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * You may elect to license modified versions of this file under the
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * terms and conditions of either the GPL or the CDDL or both.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync/*******************************************************************************
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync* Header Files *
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync*******************************************************************************/
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <iprt/system.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <iprt/assert.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <iprt/string.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <iprt/err.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <errno.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync#include <sys/utsname.h>
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsyncRTDECL(int) RTSystemQueryOSInfo(RTSYSOSINFO enmInfo, char *pszInfo, size_t cchInfo)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync{
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync /*
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * Quick validation.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync AssertReturn(enmInfo > RTSYSOSINFO_INVALID && enmInfo < RTSYSOSINFO_END, VERR_INVALID_PARAMETER);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync AssertPtrReturn(pszInfo, VERR_INVALID_POINTER);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync if (!cchInfo)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return VERR_BUFFER_OVERFLOW;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync /*
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync * Handle the request.
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync switch (enmInfo)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync {
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_PRODUCT:
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_RELEASE:
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_VERSION:
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync {
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync struct utsname UtsInfo;
558469ae1e17102c9ee2f2ece90aa7dc5137e0ccvboxsync if (uname(&UtsInfo) < 0)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return RTErrConvertFromErrno(errno);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync const char *pszSrc;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync switch (enmInfo)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync {
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_PRODUCT: pszSrc = UtsInfo.sysname; break;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_RELEASE: pszSrc = UtsInfo.release; break;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync case RTSYSOSINFO_VERSION: pszSrc = UtsInfo.version; break;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync default: AssertFatalFailed(); /* screw gcc */
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync }
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync size_t cch = strlen(pszSrc);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync if (cch < cchInfo)
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync {
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync memcpy(pszInfo, pszSrc, cch + 1);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return VINF_SUCCESS;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync }
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync memcpy(pszInfo, pszSrc, cchInfo - 1);
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync pszInfo[cchInfo - 1] = '\0';
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return VERR_BUFFER_OVERFLOW;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync }
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
295cafc57090fbc05ed081f4d1907005745afa06vboxsync case RTSYSOSINFO_SERVICE_PACK:
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync default:
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync *pszInfo = '\0';
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return VERR_NOT_SUPPORTED;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync }
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync return VINF_SUCCESS;
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync}
4a5d1cb72abd351221a0d5bdce3a01b071f697a9vboxsync