1/*
2 * The Initial Developer of the Original Code is International
3 * Business Machines Corporation. Portions created by IBM
4 * Corporation are Copyright (C) 2005 International Business
5 * Machines Corporation. All Rights Reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the Common Public License as published by
9 * IBM Corporation; either version 1 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * Common Public License for more details.
16 *
17 * You should have received a copy of the Common Public License
18 * along with this program; if not, a copy can be viewed at
19 * http://www.opensource.org/licenses/cpl1.0.php.
20 */
21
22#include "tpm_utils.h"
23
24int iLogLevel = LOG_LEVEL_ERROR;
25
26int logHex(int a_iLen, void *a_pData)
27{
28
29	int i, iByte;
30	char *pData = a_pData;
31
32	for (i = 0; i < a_iLen; i++) {
33		if ((i % 32) == 0) {
34			if (a_iLen > 32) {
35				logMsg("\n\t");
36			}
37		} else if ((i % 4) == 0) {
38			logMsg(" ");
39		}
40
41		iByte = pData[i];
42		iByte &= 0x000000ff;
43		logMsg("%02x", iByte);
44	}
45
46	logMsg("\n");
47
48	return a_iLen;
49}
50
51int logMsg(const char *a_szFormat, ...)
52{
53
54	int iCount;
55	va_list vaArgs;
56
57	va_start(vaArgs, a_szFormat);
58	iCount = logIt(stdout, a_szFormat, vaArgs);
59	va_end(vaArgs);
60
61	return iCount;
62}
63
64int logDebug(const char *a_szFormat, ...)
65{
66
67	int iCount;
68	va_list vaArgs;
69
70	if (iLogLevel < LOG_LEVEL_DEBUG)
71		return 0;
72
73	va_start(vaArgs, a_szFormat);
74	iCount = logProcess(stdout, a_szFormat, vaArgs);
75	va_end(vaArgs);
76
77	return iCount;
78}
79
80int logInfo(const char *a_szFormat, ...)
81{
82
83	int iCount;
84	va_list vaArgs;
85
86	if (iLogLevel < LOG_LEVEL_INFO)
87		return 0;
88
89	va_start(vaArgs, a_szFormat);
90	iCount = logProcess(stdout, a_szFormat, vaArgs);
91	va_end(vaArgs);
92
93	return iCount;
94}
95
96int logError(const char *a_szFormat, ...)
97{
98
99	int iCount;
100	va_list vaArgs;
101
102	if (iLogLevel < LOG_LEVEL_ERROR)
103		return 0;
104
105	va_start(vaArgs, a_szFormat);
106	iCount = logProcess(stderr, a_szFormat, vaArgs);
107	va_end(vaArgs);
108
109	return iCount;
110}
111
112int logProcess(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs)
113{
114
115	return logIt(a_sStream, a_szFormat, a_vaArgs);
116}
117
118int logIt(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs)
119{
120
121	return vfprintf(a_sStream, a_szFormat, a_vaArgs);
122}
123
124void logSuccess(const char *a_cmd)
125{
126	logInfo(_("%s succeeded\n"), a_cmd);
127}
128
129void logCmdOption(const char *aOption, const char *aDescr)
130{
131	logMsg("\t%s\n\t\t%s\n", aOption, aDescr);
132}
133
134void logGenericOptions()
135{
136	char *lOpt = NULL;
137
138	lOpt = malloc(16+strlen(LOG_NONE)+strlen(LOG_ERROR)+
139			strlen(LOG_INFO)+strlen(LOG_DEBUG));
140	if ( lOpt )
141		sprintf( lOpt, "-l, --log [%s|%s|%s|%s]", LOG_NONE, LOG_ERROR, LOG_INFO, LOG_DEBUG );
142
143	logCmdOption("-h, --help", _("Display command usage info."));
144	logCmdOption("-v, --version", _("Display command version info."));
145	logCmdOption( lOpt, _("Set logging level."));
146	free ( lOpt );
147}
148
149void logUnicodeCmdOption()
150{
151	logCmdOption("-u, --unicode", _("Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes"));
152}
153
154void logOwnerPassCmdOption()
155{
156	logCmdOption("-o, --pwdo", _("Owner password"));
157}
158
159void logNVIndexCmdOption()
160{
161	logCmdOption("-i, --index", _("Index of the NVRAM area"));
162}
163
164void logCmdHelp(const char *aCmd)
165{
166	logMsg(_("Usage: %s [options]\n"), aCmd);
167	logGenericOptions();
168}
169
170void logCmdHelpEx(const char *aCmd, char *aArgs[], char *aArgDescs[])
171{
172	int i;
173
174	logMsg(_("Usage: %s [options]"), aCmd);
175	for (i = 0; aArgs[i]; i++)
176		logMsg(" %s", aArgs[i]);
177	logMsg("\n");
178	for (i = 0; aArgDescs[i]; i++)
179		logMsg("%s\n", aArgDescs[i]);
180	logGenericOptions();
181}
182
183char *logBool(BOOL aValue)
184{
185	return aValue ? _("true") : _("false");
186}
187