summaryrefslogtreecommitdiff
path: root/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp')
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp261
1 files changed, 0 insertions, 261 deletions
diff --git a/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp b/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp
deleted file mode 100644
index fc61ef2af..000000000
--- a/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBHelper.cpp
+++ /dev/null
@@ -1,261 +0,0 @@
-/** $Id: VBoxUSBHelper.cpp $ */
-/** @file
- * VBoxUSBHelper, setuid binary wrapper for dynamic driver alias updating.
- */
-
-/*
- * Copyright (C) 2008-2009 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-/*
- * I think it is currently a security risk using VBoxUSBHelper. By that I mean
- * here we have an application that can add/remove driver aliases in a generic
- * fashion without requiring root privileges (well setuid).
- *
- * Later maybe we can change this to hardcode aliases to prefix "usb" and then
- * hardcode the driver as "ugen".
- */
-
-/*******************************************************************************
-* Header Files *
-*******************************************************************************/
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <libdevice.h>
-#include <errno.h>
-#include <syslog.h>
-
-typedef enum AliasOp
-{
- ADD_ALIAS = 12,
- DEL_ALIAS
-} AliasOp;
-
-/**
- * Print usage to stdout.
- */
-static void Usage(char *pszName)
-{
- /* @todo Eventually remove the usage syntax display & only display the copyright and warning. */
- fprintf(stderr, "Oracle VM VirtualBox USB Helper\nCopyright (C) Oracle Corporation\n\n");
-#if 0
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, "Add: %s add <alias> <drivername>\n", pszName);
- fprintf(stderr, "Delete: %s del <alias> <drivername>\n", pszName);
- fprintf(stderr, "Config: %s cfg <device>\n\n", pszName);
- fprintf(stderr, "Warning!! This program is internally used by VirtualBox and not meant to be used directly.\n");
-#endif
- exit(-1);
-}
-
-/**
- * Return code legend:
- * 0 - success.
- * -1 - no root permission
- * -2 - insufficient arguments
- * -3 - abnormal termination of update_drv (not likely)
- * -4 - update_drv failed (mostly trying to add already existing alias)
- */
-static int UpdateDrv(AliasOp Op, char *pszAlias, char *pszDrv)
-{
- char szAlias[256];
- sprintf(szAlias, "\"%s\"", pszAlias);
-
- /* Store current user ID and raise privilege. */
- uid_t userID = getuid();
- setuid(0);
-
- /* For adding alias add the driver once to make sure we can update alias, no error checking needed. */
- if (Op == ADD_ALIAS)
- {
- char szAddDrvCmd[512];
- sprintf(szAddDrvCmd, "/usr/sbin/add_drv %s\n", pszDrv);
- system(szAddDrvCmd);
- }
-
- /* Update the alias. */
- char *pszArgs[6];
- int rc = 0;
- pszArgs[0] = "/usr/sbin/update_drv";
- pszArgs[1] = (char *)(Op == ADD_ALIAS ? "-a" : "-d");
- pszArgs[2] = "-i";
- pszArgs[3] = pszAlias;
- pszArgs[4] = pszDrv;
- pszArgs[5] = NULL;
- pid_t processID = fork();
- if (processID < 0)
- {
- /* Bad. fork() failed! */
- rc = -2;
- }
- if (processID == 0)
- {
- /* Child process. */
- syslog(LOG_ERR, "VBoxUSBHelper: %s %s %s %s %s\n", pszArgs[0], pszArgs[1], pszArgs[2], pszArgs[3], pszArgs[4]);
- execv(pszArgs[0], pszArgs);
- _exit(1);
- }
-
- /* Parent process. */
- int result;
- while (waitpid(processID, &result, 0) < 0)
- ;
- if (!WIFEXITED(result)) /* abnormally terminated. */
- rc = -3;
- if (WEXITSTATUS(result) != 0) /* non-zero exit status. */
- rc = -4;
-
- /* Restore user ID. */
- setuid(userID);
-
- fprintf(stdout, "rc=%d result=%d\n", rc, result);
- return rc;
-}
-
-/**
- * Return code legend:
- * 0 - success.
- * -1 - no root permission
- * -2 - invalid USB device path
- * -3 - failed to acquire devctl_handle
- * -4 - failed to reset
- */
-static int ResetDev(char *pszDevicePath, bool fHardReset)
-{
- /* Convert the di_node device path into a devctl compatible Ap-Id. */
- char szApId[PATH_MAX + 1];
- char *pszPort = NULL;
- char *pszDir = NULL;
- int rc = 0;
-
- syslog(LOG_ERR, "VBosUSBHelper: given path=%s\n", pszDevicePath);
-
- strcpy(szApId, "/devices");
- strcat(szApId, pszDevicePath);
- pszPort = strrchr(pszDevicePath, '@');
- if (pszPort)
- {
- pszPort++;
- pszDir = strrchr(szApId, '/');
- if (pszDir)
- {
- pszDir[0] = '\0';
- strcat(szApId, ":");
- strcat(szApId, pszPort);
-
- /* Acquire devctl handle. */
- devctl_hdl_t pDevHandle;
- pDevHandle = devctl_ap_acquire(szApId, 0);
- if (pDevHandle)
- {
- /* Prepare to configure. */
- nvlist_t *pValueList = NULL;
- nvlist_alloc(&pValueList, NV_UNIQUE_NAME_TYPE, NULL);
- nvlist_add_int32(pValueList, "port", atoi(pszPort));
-
- /* Reset the device */
- rc = devctl_ap_unconfigure(pDevHandle, pValueList);
- if (!rc)
- {
- if (fHardReset)
- rc = devctl_ap_disconnect(pDevHandle, pValueList);
-
- if (!rc)
- {
- if (fHardReset)
- rc = devctl_ap_connect(pDevHandle, pValueList);
-
- if (!rc)
- {
- rc = devctl_ap_configure(pDevHandle, pValueList);
- if (rc)
- syslog(LOG_ERR, "VBoxUSBHelper: Configuring %s failed. rc=%d errno=%d\n", szApId, rc, errno);
- }
- else
- syslog(LOG_ERR, "VBoxUSBHelper: Connecting %s failed. rc=%d errno=%d\n", szApId, rc, errno);
- }
- else
- syslog(LOG_ERR, "VBoxUSBHelper: Disconnecting for %s failed. rc=%d errno=%d\n", szApId, rc, errno);
- }
- else
- syslog(LOG_ERR, "VBoxUSBHelper: Unconfigure for %s failed. rc=%d errno=%d\n", szApId, rc, errno);
-
- if (rc)
- rc = -4;
-
- /* Free-up the name-value list and the obtained handle. */
- nvlist_free(pValueList);
- devctl_release(pDevHandle);
- }
- else
- {
- syslog(LOG_ERR, "VBoxUSBHelper: devctl_ap_acquire for %s failed. errno=%d\n", szApId, errno);
- rc = -3;
- }
- }
- else
- {
- syslog(LOG_ERR, "VBoxUSBHelper: invalid device %s\n", pszDevicePath);
- rc = -1;
- }
- }
- else
- {
- syslog(LOG_ERR, "VBoxUSBHelper: invalid device %s\n", pszDevicePath);
- rc = -1;
- }
- fprintf(stdout, "rc=%d\n", rc);
- return rc;
-}
-
-/**
- * returns error code from UpdateDrv. See UpdateDrv error codes.
- */
-int main(int argc, char *argv[])
-{
- /* Check root permissions. */
- if (geteuid() != 0)
- {
- fprintf(stderr, "This program needs administrator privileges.\n");
- return -1;
- }
-
- if (argc < 3)
- {
- Usage(argv[0]);
- return -2;
- }
-
- AliasOp Operation = ADD_ALIAS;
- char *pszOp = argv[1];
- if (!strcasecmp(pszOp, "hardreset"))
- return ResetDev(argv[2], true);
- else if (!strcasecmp(pszOp, "softreset"))
- return ResetDev(argv[2], false);
- else if (!strcasecmp(pszOp, "del"))
- Operation = DEL_ALIAS;
- else if (!strcasecmp(pszOp, "add"))
- Operation = ADD_ALIAS;
- else
- {
- Usage(argv[0]);
- return -2;
- }
-
- char *pszAlias = argv[2];
- char *pszDrv = argv[3];
- /* Return status from update_drv */
- return UpdateDrv(Operation, pszAlias, pszDrv);
-}
-