Commit 6c50289a authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

- Fix msiexec's command line parsing.

- Don't allocate memory for fixed size structure. - Remove a few non-tab indents, since the rest of the file uses tabbed indent.
parent 187da09b
...@@ -67,7 +67,7 @@ static void ShowUsage(int ExitCode) ...@@ -67,7 +67,7 @@ static void ShowUsage(int ExitCode)
ExitProcess(ExitCode); ExitProcess(ExitCode);
} }
static BOOL GetProductCode(LPCSTR str, LPCSTR *PackageName, LPGUID *ProductCode) static BOOL GetProductCode(LPCSTR str, LPCSTR *PackageName, LPGUID ProductCode)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
int len = 0; int len = 0;
...@@ -77,17 +77,13 @@ static BOOL GetProductCode(LPCSTR str, LPCSTR *PackageName, LPGUID *ProductCode) ...@@ -77,17 +77,13 @@ static BOOL GetProductCode(LPCSTR str, LPCSTR *PackageName, LPGUID *ProductCode)
{ {
len = MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, 0); len = MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, 0);
wstr = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); wstr = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));
ret = (CLSIDFromString(wstr, *ProductCode) == NOERROR); ret = (CLSIDFromString(wstr, ProductCode) == NOERROR);
HeapFree(GetProcessHeap(), 0, wstr); HeapFree(GetProcessHeap(), 0, wstr);
wstr = NULL; wstr = NULL;
} }
if(!ret) if(!ret)
{
HeapFree(GetProcessHeap(), 0, *ProductCode);
*ProductCode = NULL;
*PackageName = str; *PackageName = str;
}
return ret; return ret;
} }
...@@ -183,7 +179,98 @@ static void DllUnregisterServer(LPCSTR DllName) ...@@ -183,7 +179,98 @@ static void DllUnregisterServer(LPCSTR DllName)
FreeLibrary(DllHandle); FreeLibrary(DllHandle);
} }
int main(int argc, char *argv[]) /*
* state machine to break up the command line properly
*/
enum chomp_state
{
cs_whitespace,
cs_token,
cs_quote
};
static int chomp( char *str )
{
enum chomp_state state = cs_whitespace;
char *p, *out;
int count = 0, ignore;
for( p = str, out = str; *p; p++ )
{
ignore = 1;
switch( state )
{
case cs_whitespace:
switch( *p )
{
case ' ':
break;
case '"':
state = cs_quote;
count++;
break;
default:
count++;
ignore = 0;
state = cs_token;
}
break;
case cs_token:
switch( *p )
{
case '"':
state = cs_quote;
break;
case ' ':
state = cs_whitespace;
*out++ = 0;
break;
default:
ignore = 0;
}
break;
case cs_quote:
switch( *p )
{
case '"':
state = cs_token;
break;
default:
ignore = 0;
}
break;
}
if( !ignore )
*out++ = *p;
}
*out = 0;
return count;
}
void process_args( char *cmdline, int *pargc, char ***pargv )
{
char **argv, *p = strdup(cmdline);
int i, n;
n = chomp( p );
argv = HeapAlloc(GetProcessHeap(), 0, sizeof (char*)*(n+1));
for( i=0; i<n; i++ )
{
argv[i] = p;
p += strlen(p) + 1;
}
argv[i] = NULL;
*pargc = n;
*pargv = argv;
}
int main(int argc, char **argv)
{ {
int i; int i;
BOOL FunctionInstall = FALSE; BOOL FunctionInstall = FALSE;
...@@ -199,7 +286,7 @@ int main(int argc, char *argv[]) ...@@ -199,7 +286,7 @@ int main(int argc, char *argv[])
BOOL GotProductCode = FALSE; BOOL GotProductCode = FALSE;
LPCSTR PackageName = NULL; LPCSTR PackageName = NULL;
LPGUID ProductCode = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); GUID ProductCode;
LPSTR Properties = HeapAlloc(GetProcessHeap(), 0, 1); LPSTR Properties = HeapAlloc(GetProcessHeap(), 0, 1);
DWORD RepairMode = 0; DWORD RepairMode = 0;
...@@ -222,25 +309,28 @@ int main(int argc, char *argv[]) ...@@ -222,25 +309,28 @@ int main(int argc, char *argv[])
Properties[0] = 0; Properties[0] = 0;
Transforms[0] = 0; Transforms[0] = 0;
process_args( GetCommandLineA(), &argc, &argv );
for(i = 1; i < argc; i++) for(i = 1; i < argc; i++)
{ {
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
if (!lstrcmpiA(argv[i], "/regserver")) if (!lstrcmpiA(argv[i], "/regserver"))
{ {
FunctionRegServer = TRUE; FunctionRegServer = TRUE;
} }
else if (!lstrcmpiA(argv[i], "/unregserver") || !lstrcmpiA(argv[i], "/unregister")) else if (!lstrcmpiA(argv[i], "/unregserver") || !lstrcmpiA(argv[i], "/unregister"))
{ {
FunctionUnregServer = TRUE; FunctionUnregServer = TRUE;
} }
else if(!MSIEXEC_lstrncmpiA(argv[i], "/i", 2)) else if(!MSIEXEC_lstrncmpiA(argv[i], "/i", 2))
{ {
char *argvi = argv[i]; char *argvi = argv[i];
FunctionInstall = TRUE; FunctionInstall = TRUE;
if(strlen(argvi) > 2) if(strlen(argvi) > 2)
argvi += 2; argvi += 2;
else { else
{
i++; i++;
if(i >= argc) if(i >= argc)
ShowUsage(1); ShowUsage(1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment