/*
* The Initial Developer of the Original Code is International
* Business Machines Corporation. Portions created by IBM
* Corporation are Copyright (C) 2005 International Business
* Machines Corporation. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the Common Public License as published by
* IBM Corporation; either version 1 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Common Public License for more details.
*
* You should have received a copy of the Common Public License
* along with this program; if not, a copy can be viewed at
* http://www.opensource.org/licenses/cpl1.0.php.
*/
#include "tpm_utils.h"
int iLogLevel = LOG_LEVEL_ERROR;
int logHex(int a_iLen, void *a_pData)
{
int i, iByte;
char *pData = a_pData;
for (i = 0; i < a_iLen; i++) {
if ((i % 32) == 0) {
if (a_iLen > 32) {
logMsg("\n\t");
}
} else if ((i % 4) == 0) {
logMsg(" ");
}
iByte = pData[i];
iByte &= 0x000000ff;
logMsg("%02x", iByte);
}
logMsg("\n");
return a_iLen;
}
int logMsg(const char *a_szFormat, ...)
{
int iCount;
va_list vaArgs;
va_start(vaArgs, a_szFormat);
iCount = logIt(stdout, a_szFormat, vaArgs);
va_end(vaArgs);
return iCount;
}
int logDebug(const char *a_szFormat, ...)
{
int iCount;
va_list vaArgs;
if (iLogLevel < LOG_LEVEL_DEBUG)
return 0;
va_start(vaArgs, a_szFormat);
iCount = logProcess(stdout, a_szFormat, vaArgs);
va_end(vaArgs);
return iCount;
}
int logInfo(const char *a_szFormat, ...)
{
int iCount;
va_list vaArgs;
if (iLogLevel < LOG_LEVEL_INFO)
return 0;
va_start(vaArgs, a_szFormat);
iCount = logProcess(stdout, a_szFormat, vaArgs);
va_end(vaArgs);
return iCount;
}
int logError(const char *a_szFormat, ...)
{
int iCount;
va_list vaArgs;
if (iLogLevel < LOG_LEVEL_ERROR)
return 0;
va_start(vaArgs, a_szFormat);
iCount = logProcess(stderr, a_szFormat, vaArgs);
va_end(vaArgs);
return iCount;
}
int logProcess(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs)
{
return logIt(a_sStream, a_szFormat, a_vaArgs);
}
int logIt(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs)
{
return vfprintf(a_sStream, a_szFormat, a_vaArgs);
}
void logSuccess(const char *a_cmd)
{
logInfo(_("%s succeeded\n"), a_cmd);
}
void logCmdOption(const char *aOption, const char *aDescr)
{
logMsg("\t%s\n\t\t%s\n", aOption, aDescr);
}
void logGenericOptions()
{
char *lOpt = NULL;
lOpt = malloc(16+strlen(LOG_NONE)+strlen(LOG_ERROR)+
strlen(LOG_INFO)+strlen(LOG_DEBUG));
if ( lOpt )
sprintf( lOpt, "-l, --log [%s|%s|%s|%s]", LOG_NONE, LOG_ERROR, LOG_INFO, LOG_DEBUG );
logCmdOption("-h, --help", _("Display command usage info."));
logCmdOption("-v, --version", _("Display command version info."));
logCmdOption( lOpt, _("Set logging level."));
free ( lOpt );
}
void logUnicodeCmdOption()
{
logCmdOption("-u, --unicode", _("Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes"));
}
void logOwnerPassCmdOption()
{
logCmdOption("-o, --pwdo", _("Owner password"));
}
void logNVIndexCmdOption()
{
logCmdOption("-i, --index", _("Index of the NVRAM area"));
}
void logCmdHelp(const char *aCmd)
{
logMsg(_("Usage: %s [options]\n"), aCmd);
logGenericOptions();
}
void logCmdHelpEx(const char *aCmd, char *aArgs[], char *aArgDescs[])
{
int i;
logMsg(_("Usage: %s [options]"), aCmd);
for (i = 0; aArgs[i]; i++)
logMsg(" %s", aArgs[i]);
logMsg("\n");
for (i = 0; aArgDescs[i]; i++)
logMsg("%s\n", aArgDescs[i]);
logGenericOptions();
}
char *logBool(BOOL aValue)
{
return aValue ? _("true") : _("false");
}