VBoxGuestR3LibGuestProp.cpp revision 28563f589b9e002e0ca7d7e2567f423fb620b1ad
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/* $Id$ */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/** @file
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * guest properties.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/*
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Copyright (C) 2007 Sun Microsystems, Inc.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * available from http://www.virtualbox.org. This file is free software;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * you can redistribute it and/or modify it under the terms of the GNU
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * General Public License (GPL) as published by the Free Software
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * additional information or have any questions.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/*******************************************************************************
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync* Header Files *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync*******************************************************************************/
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/string.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/mem.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/assert.h>
c8bcebedf264bc1287bcce50bdf66d08e28a88dcvboxsync#include <iprt/autores.h>
5debbbcc37114f1dbecaecfc66c81ea2fbda6140vboxsync#include <iprt/stdarg.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/log.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/HostServices/GuestPropertySvc.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include "VBGLR3Internal.h"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync/*******************************************************************************
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync* Structures and Typedefs *
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync*******************************************************************************/
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync/**
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Structure containing information needed to enumerate through guest
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * properties.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncstruct VBGLR3GUESTPROPENUM
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync{
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync /** @todo add a magic and validate the handle. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /** The buffer containing the raw enumeration data */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pchBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /** The size of the buffer */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t cchBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /** Index into the buffer pointing to the next entry to enumerate */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync};
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncusing namespace guestProp;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Connects to the guest property service.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pu32ClientId Where to put the client id on success. The client id
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * must be passed to all the other calls to the service.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(int) VbglR3GuestPropConnect(uint32_t *pu32ClientId)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VBoxGuestHGCMConnectInfo Info;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Info.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Info.Loc.type = VMMDevHGCMLoc_LocalHost_Existing;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync memset(&Info.Loc.u, 0, sizeof(Info.Loc.u));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync strcpy(Info.Loc.u.host.achName, "VBoxGuestPropSvc");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Info.u32ClientID = UINT32_MAX; /* try make valgrid shut up. */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CONNECT, &Info, sizeof(Info));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Info.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *pu32ClientId = Info.u32ClientID;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Disconnect from the guest property service.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3InfoSvcConnect().
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(int) VbglR3GuestPropDisconnect(uint32_t u32ClientId)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VBoxGuestHGCMDisconnectInfo Info;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Info.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Info.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_DISCONNECT, &Info, sizeof(Info));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Info.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Write a property value.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3InvsSvcConnect().
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszName The property to save to. Utf8
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszValue The value to store. Utf8. If this is NULL then
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * the property will be removed.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszFlags The flags for the property
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsyncVBGLR3DECL(int) VbglR3GuestPropWrite(uint32_t u32ClientId, const char *pszName, const char *pszValue, const char *pszFlags)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (pszValue != NULL)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync SetProperty Msg;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32Function = SET_PROP_VALUE;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.cParms = 2;
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.name, const_cast<char *>(pszName), strlen(pszName) + 1);
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.value, const_cast<char *>(pszValue), strlen(pszValue) + 1);
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.flags, const_cast<char *>(pszFlags), strlen(pszFlags) + 1);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Msg.hdr.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync DelProperty Msg;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32Function = DEL_PROP;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.cParms = 1;
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.name, const_cast<char *>(pszName), strlen(pszName) + 1);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Msg.hdr.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Write a property value.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3InvsSvcConnect().
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszName The property to save to. Must be valid UTF-8.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszValue The value to store. Must be valid UTF-8.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * If this is NULL then the property will be removed.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @note if the property already exists and pszValue is not NULL then the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * property's flags field will be left unchanged
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsyncVBGLR3DECL(int) VbglR3GuestPropWriteValue(uint32_t u32ClientId, const char *pszName, const char *pszValue)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (pszValue != NULL)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync SetPropertyValue Msg;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32Function = SET_PROP_VALUE;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.cParms = 2;
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.name, const_cast<char *>(pszName), strlen(pszName) + 1);
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.value, const_cast<char *>(pszValue), strlen(pszValue) + 1);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Msg.hdr.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync DelProperty Msg;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32Function = DEL_PROP;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.cParms = 1;
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync VbglHGCMParmPtrSet(&Msg.name, const_cast<char *>(pszName), strlen(pszName) + 1);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Msg.hdr.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync/**
9f9eff04f209bd905529ee3b76076e55568db917vboxsync * Write a property value where the value is formatted in RTStrPrintfV fashion.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @returns The same as VbglR3GuestPropWriteValue with the addition of VERR_NO_STR_MEMORY.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param u32ClientId The client ID returned by VbglR3InvsSvcConnect().
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszName The property to save to. Must be valid UTF-8.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszValueFormat The value format. This must be valid UTF-8 when fully formatted.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param va The format arguments.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsyncVBGLR3DECL(int) VbglR3GuestPropWriteValueV(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, va_list va)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync{
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync /*
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * Format the value and pass it on to the setter.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync int rc = VERR_NO_STR_MEMORY;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync char *pszValue;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (RTStrAPrintfV(&pszValue, pszValueFormat, va) < 0)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, pszValue);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync RTStrFree(pszValue);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync return rc;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync}
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync/**
9f9eff04f209bd905529ee3b76076e55568db917vboxsync * Write a property value where the value is formatted in RTStrPrintf fashion.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @returns The same as VbglR3GuestPropWriteValue with the addition of VERR_NO_STR_MEMORY.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync *
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param u32ClientId The client ID returned by VbglR3InvsSvcConnect().
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszName The property to save to. Must be valid UTF-8.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param pszValueFormat The value format. This must be valid UTF-8 when fully formatted.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync * @param ... The format arguments.
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsyncVBGLR3DECL(int) VbglR3GuestPropWriteValueF(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, ...)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync{
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync va_list va;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync va_start(va, pszValueFormat);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync int rc = VbglR3GuestPropWriteValueV(u32ClientId, pszName, pszValueFormat, va);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync va_end(va);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync return rc;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync}
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Retrieve a property.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VINF_SUCCESS on success, pszValue, pu64Timestamp and pszFlags
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * containing valid data.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VERR_BUFFER_OVERFLOW if the scratch buffer @a pcBuf is not large
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * enough. In this case the size needed will be placed in
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @a pcbBufActual if it is not NULL.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VERR_NOT_FOUND if the key wasn't found.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3ClipboardConnect().
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszName The value to read. Utf8
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param pvBuf A scratch buffer to store the data retrieved into.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * The returned data is only valid for it's lifetime.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @a ppszValue will point to the start of this buffer.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param cbBuf The size of @a pcBuf
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszValue Where to store the pointer to the value retrieved.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Optional.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pu64Timestamp Where to store the timestamp. Optional.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszFlags Where to store the pointer to the flags. Optional.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pcbBufActual If @a pcBuf is not large enough, the size needed.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Optional.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(int) VbglR3GuestPropRead(uint32_t u32ClientId, const char *pszName,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync void *pvBuf, uint32_t cbBuf,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char **ppszValue, uint64_t *pu64Timestamp,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char **ppszFlags,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync uint32_t *pcbBufActual)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync GetProperty Msg;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32ClientID = u32ClientId;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.u32Function = GET_PROP;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Msg.hdr.cParms = 4;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VbglHGCMParmPtrSet(&Msg.name, const_cast<char *>(pszName),
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync strlen(pszName) + 1);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VbglHGCMParmPtrSet(&Msg.buffer, pvBuf, cbBuf);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VbglHGCMParmUInt64Set(&Msg.timestamp, 0);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VbglHGCMParmUInt32Set(&Msg.size, 0);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = Msg.hdr.result;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if ((VERR_BUFFER_OVERFLOW == rc) && (pcbBufActual != NULL))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc2 = VbglHGCMParmUInt32Get(&Msg.size, pcbBufActual);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!RT_SUCCESS(rc2))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = rc2;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc) && (pu64Timestamp != NULL))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = VbglHGCMParmUInt64Get(&Msg.timestamp, pu64Timestamp);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc) && (ppszValue != NULL))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *ppszValue = reinterpret_cast<char *>(pvBuf);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc) && (ppszFlags != NULL))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync char *pszEos = reinterpret_cast<char *>(memchr(pvBuf, '\0', cbBuf));
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync if (pszEos)
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync *ppszFlags = pszEos + 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync rc = VERR_TOO_MUCH_DATA;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Retrieve a property value, allocating space for it.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync * @retval VINF_SUCCESS on success, *ppszValue containing valid data.
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * @retval VERR_NOT_FOUND if the key wasn't found.
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync * @retval VERR_TOO_MUCH_DATA if we were unable to determine the right size
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync * to allocate for the buffer. This can happen as the result of a
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync * race between our allocating space and the host changing the
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync * property value.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3ClipboardConnect().
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * @param pszName The value to read. Must be valid UTF-8.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param ppszValue Where to store the pointer to the value returned.
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * This is always set to NULL or to the result, even
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * on failure.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(int) VbglR3GuestPropReadValueAlloc(uint32_t u32ClientId,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync const char *pszName,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char **ppszValue)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync /*
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * Quick input validation.
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync */
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync AssertPtr(ppszValue);
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync *ppszValue = NULL;
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync AssertPtrReturn(pszName, VERR_INVALID_PARAMETER);
e61cd03db2217b7ec7467065af02d7ea7549149evboxsync
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync /*
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * There is a race here between our reading the property size and the
e61cd03db2217b7ec7467065af02d7ea7549149evboxsync * host changing the value before we read it. Try up to ten times and
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync * report the problem if that fails.
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync */
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync char *pszValue = NULL;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync void *pvBuf = NULL;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync uint32_t cchBuf = MAX_VALUE_LEN;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync int rc = VERR_BUFFER_OVERFLOW;
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync for (unsigned i = 0; i < 10 && rc == VERR_BUFFER_OVERFLOW; ++i)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync /* We leave a bit of space here in case the maximum value is raised. */
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync cchBuf += 1024;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync void *pvTmpBuf = RTMemRealloc(pvBuf, cchBuf);
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync if (pvTmpBuf)
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync {
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync pvBuf = pvTmpBuf;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync rc = VbglR3GuestPropRead(u32ClientId, pszName, pvBuf, cchBuf,
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync &pszValue, NULL, NULL, &cchBuf);
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync }
e61cd03db2217b7ec7467065af02d7ea7549149evboxsync else
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync rc = VERR_NO_MEMORY;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync {
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync Assert(pszValue == (char *)pvBuf);
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *ppszValue = pszValue;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync }
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync else
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync {
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync RTMemFree(pvBuf);
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync if (rc == VERR_BUFFER_OVERFLOW)
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync /* VERR_BUFFER_OVERFLOW has a different meaning here as a
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * return code, but we need to report the race. */
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync rc = VERR_TOO_MUCH_DATA;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync }
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Free the memory used by VbglR3GuestPropReadValueAlloc for returning a
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * value.
243041cd7eae9f34b08e7340533b2a88218ee57evboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszValue the memory to be freed. NULL pointers will be ignored.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(void) VbglR3GuestPropReadValueFree(char *pszValue)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTMemFree(pszValue);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/**
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Retrieve a property value, using a user-provided buffer to store it.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @returns VBox status code.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VINF_SUCCESS on success, pszValue containing valid data.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VERR_BUFFER_OVERFLOW and the size needed in pcchValueActual if the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * buffer provided was too small
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @retval VERR_NOT_FOUND if the key wasn't found.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @note There is a race here between obtaining the size of the buffer
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * needed to hold the value and the value being updated.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param u32ClientId The client id returned by VbglR3ClipboardConnect().
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszName The value to read. Utf8
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pszValue Where to store the value retrieved.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param cchValue The size of the buffer pointed to by @a pszValue
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * @param pcchValueActual Where to store the size of the buffer needed if
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * the buffer supplied is too small. Optional.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncVBGLR3DECL(int) VbglR3GuestPropReadValue(uint32_t u32ClientId, const char *pszName,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char *pszValue, uint32_t cchValue,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync uint32_t *pcchValueActual)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char *pcBuf = NULL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc = VbglR3GuestPropReadValueAlloc(u32ClientId, pszName, &pcBuf);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync uint32_t cchValueActual = strlen(pcBuf) + 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (cchValueActual > cchValue)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (pcchValueActual != NULL)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *pcchValueActual = cchValueActual;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = VERR_BUFFER_OVERFLOW;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync strcpy(pszValue, pcBuf);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VbglR3GuestPropReadValueFree(pcBuf);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync/**
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Raw API for enumerating guest properties which match a given pattern.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync * @returns VBox status code.
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync * @retval VINF_SUCCESS on success and pcBuf points to a packed array
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * of the form <name>, <value>, <timestamp string>, <flags>,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * terminated by four empty strings. pcbBufActual will contain the
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * total size of the array.
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync * @retval VERR_BUFFER_OVERFLOW if the buffer provided was too small. In
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * this case pcbBufActual will contain the size of the buffer needed.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @returns IPRT error code in other cases, and pchBufActual is undefined.
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync *
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param u32ClientId The client ID returned by VbglR3GuestPropConnect
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param paszPatterns A packed array of zero terminated strings, terminated
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * by an empty string.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param pcBuf The buffer to store the results to.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param cbBuf The size of the buffer
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param pcbBufActual Where to store the size of the returned data on
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * success or the buffer size needed if @a pcBuf is too
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * small.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncVBGLR3DECL(int) VbglR3GuestPropEnumRaw(uint32_t u32ClientId,
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync const char *pszzPatterns,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pcBuf,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t cbBuf,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t *pcbBufActual)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync{
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync EnumProperties Msg;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync Msg.hdr.result = (uint32_t)VERR_WRONG_ORDER; /** @todo drop the cast when the result type has been fixed! */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync Msg.hdr.u32ClientID = u32ClientId;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync Msg.hdr.u32Function = ENUM_PROPS;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync Msg.hdr.cParms = 3;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Get the length of the patterns array... */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t cchPatterns = 0;
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync for (uint32_t cchCurrent = strlen(pszzPatterns); cchCurrent != 0;
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync cchCurrent = strlen(pszzPatterns + cchPatterns))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync cchPatterns += cchCurrent + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* ...including the terminator. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync ++cchPatterns;
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync VbglHGCMParmPtrSet(&Msg.patterns, const_cast<char *>(pszzPatterns),
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync cchPatterns);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync VbglHGCMParmPtrSet(&Msg.strings, pcBuf, cbBuf);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync VbglHGCMParmUInt32Set(&Msg.size, 0);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = Msg.hdr.result;
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync if ( pcbBufActual
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync && ( RT_SUCCESS(rc)
0c436e66dac8edc81d43b54cd878ed239a63574bvboxsync || rc == VERR_BUFFER_OVERFLOW))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync {
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync int rc2 = VbglHGCMParmUInt32Get(&Msg.size, pcbBufActual);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (!RT_SUCCESS(rc2))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = rc2;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync }
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync return rc;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync}
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync/**
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Start enumerating guest properties which match a given pattern.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * This function creates a handle which can be used to continue enumerating.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @returns VBox status code.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @retval VINF_SUCCESS on success, *ppHandle points to a handle for continuing
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * the enumeration and *ppszName, *ppszValue, *pu64Timestamp and
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * *ppszFlags are set.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @retval VERR_NOT_FOUND if no matching properties were found. In this case
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * the return parameters are not initialised.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @retval VERR_TOO_MUCH_DATA if it was not possible to determine the amount
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * of local space needed to store all the enumeration data. This is
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * due to a race between allocating space and the host adding new
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * data, so retrying may help here. Other parameters are left
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * uninitialised
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param u32ClientId The client id returned by VbglR3InfoSvcConnect().
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param papszPatterns The patterns against which the properties are
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * matched. Pass NULL if everything should be matched.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param cPatterns The number of patterns in @a papszPatterns. 0 means
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * match everything.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param ppHandle where the handle for continued enumeration is stored
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * on success. This must be freed with
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * VbglR3GuestPropEnumFree when it is no longer needed.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param ppszName Where to store the first property name on success.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * Should not be freed.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param ppszValue Where to store the first property value on success.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * Should not be freed.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param ppszValue Where to store the first timestamp value on success.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param ppszFlags Where to store the first flags value on success.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * Should not be freed.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @todo Make papszPatterns char const * const *, and cPatterns size_t (so we
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * can use RT_ELEMENTS without getting warnings on Windows).
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * Most of the returns should also be made char const * to discourage
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * changes and encourage compiler optimizations.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncVBGLR3DECL(int) VbglR3GuestPropEnum(uint32_t u32ClientId,
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync char **papszPatterns,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync int cPatterns,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync PVBGLR3GUESTPROPENUM *ppHandle,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszName,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszValue,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint64_t *pu64Timestamp,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszFlags)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync{
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync int rc = VINF_SUCCESS;
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync RTMemAutoPtr<VBGLR3GUESTPROPENUM, VbglR3GuestPropEnumFree> Handle;
1a196b7b2e2ec42a3b22165d4be9dae161c1dddcvboxsync Handle = (PVBGLR3GUESTPROPENUM) RTMemAllocZ(sizeof(VBGLR3GUESTPROPENUM));
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync if (!Handle)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = VERR_NO_MEMORY;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Get the length of the pattern string, including the final terminator. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t cchPatterns = 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync for (int i = 0; i < cPatterns; ++i)
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync cchPatterns += strlen(papszPatterns[i]) + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Pack the pattern array */
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync RTMemAutoPtr<char> Patterns;
1a196b7b2e2ec42a3b22165d4be9dae161c1dddcvboxsync Patterns = (char *) RTMemAlloc(cchPatterns);
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync size_t iOffs = 0;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync for (int i = 0; i < cPatterns; ++i)
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync {
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync size_t cb = strlen(papszPatterns[i]) + 1;
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync memcpy(&Patterns[iOffs], papszPatterns[i], cb);
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync iOffs += cb;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync }
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync Patterns[iOffs] = '\0';
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Randomly chosen initial size for the buffer to hold the enumeration
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * information. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t cchBuf = 4096;
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync RTMemAutoPtr<char> Buf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* In reading the guest property data we are racing against the host
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * adding more of it, so loop a few times and retry on overflow. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync bool finish = false;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync for (int i = 0; (i < 10) && !finish; ++i)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync {
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync if (!Buf.realloc(cchBuf))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = VERR_NO_MEMORY;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc) || (VERR_BUFFER_OVERFLOW == rc))
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync rc = VbglR3GuestPropEnumRaw(u32ClientId, Patterns.get(),
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync Buf.get(), cchBuf, &cchBuf);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (rc != VERR_BUFFER_OVERFLOW)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync finish = true;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync else
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync cchBuf += 4096; /* Just to increase our chances */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync }
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (VERR_BUFFER_OVERFLOW == rc)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = VERR_TOO_MUCH_DATA;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync {
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Transfer ownership of the buffer to the handle structure. */
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync Handle->pchBuf = Buf.release();
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync Handle->cchBuf = cchBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync }
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc))
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync rc = VbglR3GuestPropEnumNext(Handle.get(), ppszName, ppszValue,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync pu64Timestamp, ppszFlags);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc) && (NULL == ppszName))
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* No matching properties found */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = VERR_NOT_FOUND;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* And transfer ownership of the handle to the caller. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (RT_SUCCESS(rc))
7c930c3ee58f55e1a2cebfa2ad3ae918569a8f44vboxsync *ppHandle = Handle.release();
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync return rc;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync}
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync/**
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Get the next guest property. See @a VbglR3GuestPropEnum.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @returns VBox status code.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync *
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @param pHandle Handle obtained from @a VbglR3GuestPropEnum.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @param ppszName Where to store the next property name. This will be
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * set to NULL if there are no more properties to
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * enumerate. This pointer should not be freed.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @param ppszValue Where to store the next property value. This will be
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * set to NULL if there are no more properties to
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * enumerate. This pointer should not be freed.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @param pu64Timestamp Where to store the next property timestamp. This
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * will be set to zero if there are no more properties
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * to enumerate.
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync * @param ppszFlags Where to store the next property flags. This will be
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * set to NULL if there are no more properties to
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * enumerate. This pointer should not be freed.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @todo return char const *.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncVBGLR3DECL(int) VbglR3GuestPropEnumNext(PVBGLR3GUESTPROPENUM pHandle,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszName,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszValue,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint64_t *pu64Timestamp,
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char **ppszFlags)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync{
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint32_t iBuf = pHandle->iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pszName = pHandle->pchBuf + iBuf;
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync /** @todo replace these with safe memchr's and return an error if needed. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync iBuf += strlen(pszName) + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pszValue = pHandle->pchBuf + iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync iBuf += strlen(pszValue) + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pszTimestamp = pHandle->pchBuf + iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync iBuf += strlen(pszTimestamp) + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync uint64_t u64Timestamp = RTStrToUInt64(pszTimestamp);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync char *pszFlags = pHandle->pchBuf + iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync iBuf += strlen(pszFlags) + 1;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* Otherwise we just stay at the end of the list. */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if ((iBuf != pHandle->iBuf + 4) && (iBuf < pHandle->cchBuf) /* sanity */)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync pHandle->iBuf = iBuf;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync *ppszName = *pszName != 0 ? pszName : NULL;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync *ppszValue = pszValue != 0 ? pszValue : NULL;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync *pu64Timestamp = u64Timestamp;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync *ppszFlags = pszFlags != 0 ? pszFlags : NULL;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync return VINF_SUCCESS;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync}
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync/**
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * Free an enumeration handle returned by @a VbglR3GuestPropEnum.
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync * @param pHandle the handle to free
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncVBGLR3DECL(void) VbglR3GuestPropEnumFree(PVBGLR3GUESTPROPENUM pHandle)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync{
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync RTMemFree(pHandle->pchBuf);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync RTMemFree(pHandle);
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync}
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync/**
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * Deletes a set of keys.
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * The set is specified in the same way as for VbglR3GuestPropEnum.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @returns VBox status code. Stops on first failure.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * See also VbglR3GuestPropEnum.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync *
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param u32ClientId The client id returned by VbglR3InfoSvcConnect().
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param papszPatterns The patterns against which the properties are
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * matched. Pass NULL if everything should be matched.
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * @param cPatterns The number of patterns in @a papszPatterns. 0 means
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync * match everything.
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync */
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsyncVBGLR3DECL(int) VbglR3GuestPropDelSet(uint32_t u32ClientId,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync const char * const *papszPatterns,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync size_t cPatterns)
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync{
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync PVBGLR3GUESTPROPENUM pHandle;
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync char *pszName;
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync char *pszValue;
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync uint64_t pu64Timestamp;
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync char *pszFlags;
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync int rc = VbglR3GuestPropEnum(u32ClientId,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync (char **)papszPatterns, /** @todo fix this cast. */
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync cPatterns,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync &pHandle,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync &pszName,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync &pszValue,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync &pu64Timestamp,
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync &pszFlags);
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync while (RT_SUCCESS(rc) && pszName)
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync {
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, NULL);
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync if (!RT_SUCCESS(rc))
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync break;
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync rc = VbglR3GuestPropEnumNext(pHandle,
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync &pszName,
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync &pszValue,
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync &pu64Timestamp,
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync &pszFlags);
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync }
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync VbglR3GuestPropEnumFree(pHandle);
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync return rc;
33d90ac36a3ebf89e46a50252fe9542602a6b2bevboxsync}
28563f589b9e002e0ca7d7e2567f423fb620b1advboxsync