/*++ Copyright (c) 2002 - 2002 Microsoft Corporation. All Rights Reserved. THIS CODE AND INFORMATION IS PROVIDED "AS-IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. THIS CODE IS NOT SUPPORTED BY MICROSOFT. --*/ #include "precomp.h" #pragma hdrstop /***************************************************************************++ Routine Description: main routine. Arguments: argc - # of command line arguments. argv - Arguments. Return Value: Success/Failure. --***************************************************************************/ int _cdecl wmain(int argc, LPWSTR argv[]) { DWORD Status = NO_ERROR; HTTPCFG_TYPE Type; HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_1; WORD wVersionRequested; WSADATA wsaData; // Parse command line parameters. if(argc < 3) { NlsPutMsg(HTTPCFG_USAGE, argv[0]); return 0; } argv++; argc --; // // First parse the type of operation. // if(_wcsicmp(argv[0], L"set") == 0) { Type = HttpCfgTypeSet; } else if(_wcsicmp(argv[0], L"query") == 0) { Type = HttpCfgTypeQuery; } else if(_wcsicmp(argv[0], L"delete") == 0) { Type = HttpCfgTypeDelete; } else if(_wcsicmp(argv[0], L"?") == 0) { NlsPutMsg(HTTPCFG_USAGE, argv[0]); return 0; } else { NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]); return ERROR_INVALID_PARAMETER; } argv++; argc--; // // Call HttpInitialize. // if((Status = HttpInitialize( HttpApiVersion, HTTP_INITIALIZE_CONFIG, NULL)) != NO_ERROR) { NlsPutMsg(HTTPCFG_HTTPINITIALIZE, Status); return Status; } // // Call WSAStartup as we are using some winsock functions. // wVersionRequested = MAKEWORD( 2, 2 ); if(WSAStartup( wVersionRequested, &wsaData ) != 0) { HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL); return GetLastError(); } // // Call the corresponding API. // if(_wcsicmp(argv[0], L"ssl") == 0) { argv++; argc--; Status = DoSsl(argc, argv, Type); } else if(_wcsicmp(argv[0], L"urlacl") == 0) { argv++; argc--; Status = DoUrlAcl(argc, argv, Type); } else if(_wcsicmp(argv[0], L"iplisten") == 0) { argv++; argc--; Status = DoIpListen(argc, argv, Type); } else { NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]); Status = ERROR_INVALID_PARAMETER; } WSACleanup(); HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL); return Status; } /***************************************************************************++ Routine Description: Write output Arguments: Handle - Handle to write to. MsgNumber - The message number. ... - Optional arguments. Return Value: Success/Failure. --***************************************************************************/ UINT NlsPutMsg ( IN UINT MsgNumber, IN ... ) { UINT msglen; VOID *vp; va_list arglist; va_start(arglist, MsgNumber); msglen = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER, // dwFlags. NULL, // lpSource. MsgNumber, // dwMessageId. 0L, // dwLanguageId (default) (LPWSTR)&vp, 0, &arglist ); if(!msglen) { return 0; } wprintf(L"%ws", vp); LocalFree(vp); return msglen; } /***************************************************************************++ Routine Description: Given a WCHAR IP, this routine converts it to a SOCKADDR. Arguments: pIp - IP address to covert. pBuffer - Buffer, must be == sizeof(SOCKADDR_STORAGE) Length - Length of buffer Return Value: Success/Failure. --***************************************************************************/ DWORD GetAddress( PWCHAR pIp, PVOID pBuffer, ULONG Length ) { DWORD Status; DWORD TempStatus; if(pIp == NULL) { return ERROR_INVALID_PARAMETER; } // // The address could be a v4 or a v6 address. First, let's try v4. // Status = WSAStringToAddress( pIp, AF_INET, NULL, pBuffer, (LPINT)&Length ); if(Status != NO_ERROR) { // // Now, try v6 // Status = WSAGetLastError(); TempStatus = WSAStringToAddress( pIp, AF_INET6, NULL, pBuffer, (LPINT)&Length ); // // If IPv6 also fails, then we want to return the original // error. // // If it succeeds, we want to return NO_ERROR. // if(TempStatus == NO_ERROR) { Status = NO_ERROR; } } return Status; }