VBoxExtPackHelperApp.cpp revision 710d24589d0cbe0ea6e9ad143eda5bbd41000693
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/* $Id$ */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/** @file
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * VirtualBox Main - Extension Pack Helper Application, usually set-uid-to-root.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/*
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Copyright (C) 2010 Oracle Corporation
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk *
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * This file is part of VirtualBox Open Source Edition (OSE), as
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * available from http://www.virtualbox.org. This file is free software;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * you can redistribute it and/or modify it under the terms of the GNU
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * General Public License (GPL) as published by the Free Software
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Foundation, in version 2 as it comes in the "COPYING" file of the
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/*******************************************************************************
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk* Header Files *
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk*******************************************************************************/
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include "include/ExtPackUtil.h"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/buildconfig.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/ctype.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/dir.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/env.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/file.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/getopt.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/initterm.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/message.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/param.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/path.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk//#include <iprt/pipe.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/string.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <iprt/stream.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <VBox/log.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <VBox/err.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk#include <VBox/version.h>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/* Override RTAssertShouldPanic to prevent gdb process creation. */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenkRTDECL(bool) RTAssertShouldPanic(void)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk{
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return true;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk}
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/**
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Implements the 'install' command.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk *
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @returns The program exit code.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param argc The number of program arguments.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param argv The program arguments.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenkstatic RTEXITCODE DoInstall(int argc, char **argv)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk{
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return RTEXITCODE_FAILURE;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk}
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk/**
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Implements the 'uninstall' command.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk *
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @returns The program exit code.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param argc The number of program arguments.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * @param argv The program arguments.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenkstatic RTEXITCODE DoUninstall(int argc, char **argv)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk{
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return RTEXITCODE_FAILURE;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk}
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenkint main(int argc, char **argv)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk{
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk int rc = RTR3Init();
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (RT_FAILURE(rc))
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return RTMsgInitFailure(rc);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTEXITCODE rcExit = RTEXITCODE_FAILURE;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (argc > 1)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk /*
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Command string switch.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (!strcmp(argv[1], "install"))
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rcExit = DoInstall(argc, argv);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk else if (!strcmp(argv[1], "uninstall"))
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rcExit = DoUninstall(argc, argv);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk else
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk /*
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk * Didn't match a command, check for standard options.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk */
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTGETOPTSTATE State;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rc = RTGetOptInit(&State, argc, argv, NULL, 0, 1, 0 /*fFlags*/);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if (RT_SUCCESS(rc))
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk for (;;)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTGETOPTUNION ValueUnion;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk int ch = RTGetOpt(&State, &ValueUnion);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk switch (ch)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk {
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk case 'h':
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTMsgInfo(VBOX_PRODUCT " Extension Pack Helper App\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "(C) " VBOX_C_YEAR " " VBOX_VENDOR "\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "All rights reserved.\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "This NOT intended for general use, please use VBoxManage instead\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "or call the IExtPackManager API directly.\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "Usage: %s <command> [options]\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "Commands:\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk " install --basepath <dir> --name <name> --tarball <tarball> --tarball-fd <fd>\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk " uninstall --basepath <dir> --name <name>\n"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk , RTPathFilename(argv[0]));
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rcExit = RTEXITCODE_SUCCESS;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk break;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk case 'V':
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTPrintf("%sr%d\n", VBOX_VERSION_STRING, RTBldCfgRevision());
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rcExit = RTEXITCODE_SUCCESS;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk break;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk default:
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk rcExit = RTGetOptPrintError(ch, &ValueUnion);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk break;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk }
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk }
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk }
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk else
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTMsgError("RTGetOptInit failed: %Rrc\n", rc);
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk }
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk }
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk else
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk RTMsgError("No command was specified\n");
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk return rcExit;
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk}
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk