USBGetDevices.h revision c5d77d266d72c6ccdd1d89d974934d8e57e8bcf9
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/* $Id$ */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/** @file
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * VirtualBox Linux host USB device enumeration.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/*
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Copyright (C) 2006-2010 Oracle Corporation
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * This file is part of VirtualBox Open Source Edition (OSE), as
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * available from http://www.virtualbox.org. This file is free software;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * you can redistribute it and/or modify it under the terms of the GNU
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * General Public License (GPL) as published by the Free Software
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Foundation, in version 2 as it comes in the "COPYING" file of the
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#ifndef ___USBGetDevices_h
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen# define ___USBGetDevices_h
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#include <VBox/usb.h>
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#include <iprt/mem.h>
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#include <iprt/string.h>
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/**
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Free all the members of a USB device created by the Linux enumeration code.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * @note this duplicates a USBProxyService method which we needed access too
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * without pulling in the rest of the proxy service code.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * @param pDevice Pointer to the device.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenstatic inline void deviceFreeMembers(PUSBDEVICE pDevice)
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen{
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen RTStrFree((char *)pDevice->pszManufacturer);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pDevice->pszManufacturer = NULL;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen RTStrFree((char *)pDevice->pszProduct);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pDevice->pszProduct = NULL;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen RTStrFree((char *)pDevice->pszSerialNumber);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pDevice->pszSerialNumber = NULL;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen RTStrFree((char *)pDevice->pszAddress);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pDevice->pszAddress = NULL;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen}
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/**
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Free one USB device created by the Linux enumeration code.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * @note this duplicates a USBProxyService method which we needed access too
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * without pulling in the rest of the proxy service code.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * @param pDevice Pointer to the device.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenstatic inline void deviceFree(PUSBDEVICE pDevice)
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen{
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen deviceFreeMembers(pDevice);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen RTMemFree(pDevice);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen}
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen/**
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * Free a linked list of USB devices created by the Linux enumeration code.
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen * @param pHead Pointer to the first device in the linked list
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen */
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenstatic inline void deviceListFree(PUSBDEVICE *ppHead)
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen{
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen PUSBDEVICE pHead, pNext;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pHead = *ppHead;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen while (pHead)
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen {
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pNext = pHead->pNext;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen deviceFree(pHead);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen pHead = pNext;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen }
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen *ppHead = NULL;
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen}
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie BowenRT_C_DECLS_BEGIN
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenextern bool USBProxyLinuxCheckDeviceRoot(const char *pcszRoot,
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen bool fIsDeviceNodes);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#ifdef UNIT_TEST
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenvoid TestUSBSetupInit(const char *pcszUsbfsRoot, bool fUsbfsAccessible,
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen const char *pcszDevicesRoot, bool fDevicesAccessible,
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen int rcMethodInitResult);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowenvoid TestUSBSetEnv(const char *pcszEnvUsb, const char *pcszEnvUsbRoot);
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen#endif
5c124de5c36bfc236d55578429df5f048f0d0a07Jamie Bowen
extern int USBProxyLinuxChooseMethod(bool *pfUsingUsbfsDevices,
const char **ppcszDevicesRoot);
#ifdef UNIT_TEST
extern void TestUSBSetAvailableUsbfsDevices(const char **pacszDeviceAddresses);
extern void TestUSBSetAccessibleFiles(const char **pacszAccessibleFiles);
#endif
extern PUSBDEVICE USBProxyLinuxGetDevices(const char *pcszDevicesRoot,
bool fUseSysfs);
RT_C_DECLS_END
#endif /* ___USBGetDevices_h */