diff options
Diffstat (limited to 'Common/Cmdline.c')
-rw-r--r-- | Common/Cmdline.c | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/Common/Cmdline.c b/Common/Cmdline.c new file mode 100644 index 0000000..ebeae8f --- /dev/null +++ b/Common/Cmdline.c @@ -0,0 +1,240 @@ +/* + Legal Notice: Some portions of the source code contained in this file were + derived from the source code of Encryption for the Masses 2.02a, which is + Copyright (c) 1998-2000 Paul Le Roux and which is governed by the 'License + Agreement for Encryption for the Masses'. Modifications and additions to + the original source code (contained in this file) and all other portions + of this file are Copyright (c) 2003-2009 TrueCrypt Developers Association + and are governed by the TrueCrypt License 3.0 the full text of which is + contained in the file License.txt included in TrueCrypt binary and source + code distribution packages. */ + +#include "Tcdefs.h" + +#include <malloc.h> +#include <ctype.h> +#include "Cmdline.h" + +#include "Resource.h" +#include "Crypto.h" +#include "Apidrvr.h" +#include "Dlgcode.h" +#include "Language.h" + +/* Except in response to the WM_INITDIALOG message, the dialog box procedure + should return nonzero if it processes the message, and zero if it does + not. - see DialogProc */ +BOOL CALLBACK CommandHelpDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (lParam); /* remove warning */ + if (wParam); /* remove warning */ + + switch (msg) + { + case WM_INITDIALOG: + { + char * tmp = err_malloc(8192); + char tmp2[MAX_PATH * 2]; + argumentspec *as; + int i; + + LocalizeDialog (hwndDlg, "IDD_COMMANDHELP_DLG"); + + as = (argumentspec*) lParam; + + *tmp = 0; + + strcpy (tmp, "Command line options:\n\n"); + for (i = 0; i < as->arg_cnt; i ++) + { + if (!as->args[i].Internal) + { + sprintf(tmp2, "%s\t%s\n", as->args[i].short_name, as->args[i].long_name); + strcat(tmp,tmp2); + } + } + + SetWindowText (GetDlgItem (hwndDlg, IDC_COMMANDHELP_TEXT), (char*) tmp); + return 1; + } + + case WM_COMMAND: + EndDialog (hwndDlg, IDOK); + return 1; + case WM_CLOSE: + EndDialog (hwndDlg, 0); + return 1; + } + + return 0; +} + +int Win32CommandLine (char *lpszCommandLine, char ***lpszArgs) +{ + int argumentCount; + int i; + + LPWSTR *arguments = CommandLineToArgvW (GetCommandLineW(), &argumentCount); + if (!arguments) + { + handleWin32Error (NULL); + return 0; + } + + --argumentCount; + if (argumentCount < 1) + { + LocalFree (arguments); + return 0; + } + + *lpszArgs = malloc (sizeof (char *) * argumentCount); + if (!*lpszArgs) + AbortProcess ("OUTOFMEMORY"); + + for (i = 0; i < argumentCount; ++i) + { + size_t argLen = wcslen (arguments[i + 1]); + + char *arg = malloc (argLen + 1); + if (!arg) + AbortProcess ("OUTOFMEMORY"); + + if (argLen > 0) + { + int len = WideCharToMultiByte (CP_ACP, 0, arguments[i + 1], -1, arg, argLen + 1, NULL, NULL); + if (len == 0) + { + handleWin32Error (NULL); + AbortProcessSilent(); + } + } + else + arg[0] = 0; + + (*lpszArgs)[i] = arg; + } + + LocalFree (arguments); + return argumentCount; +} + +int GetArgSepPosOffset (char *lpszArgument) +{ + if (lpszArgument[0] == '/') + return 1; + + return 0; +} + +int GetArgumentID (argumentspec *as, char *lpszArgument, int *nArgPos) +{ + char szTmp[MAX_PATH * 2]; + int i; + + i = strlen (lpszArgument); + szTmp[i] = 0; + while (--i >= 0) + { + szTmp[i] = (char) tolower (lpszArgument[i]); + } + + for (i = 0; i < as->arg_cnt; i++) + { + size_t k; + + k = strlen (as->args[i].long_name); + if (memcmp (as->args[i].long_name, szTmp, k * sizeof (char)) == 0) + { + int x; + for (x = i + 1; x < as->arg_cnt; x++) + { + size_t m; + + m = strlen (as->args[x].long_name); + if (memcmp (as->args[x].long_name, szTmp, m * sizeof (char)) == 0) + { + break; + } + } + + if (x == as->arg_cnt) + { + if (strlen (lpszArgument) != k) + *nArgPos = k; + else + *nArgPos = 0; + return as->args[i].Id; + } + } + } + + for (i = 0; i < as->arg_cnt; i++) + { + size_t k; + + if (as->args[i].short_name[0] == 0) + continue; + + k = strlen (as->args[i].short_name); + if (memcmp (as->args[i].short_name, szTmp, k * sizeof (char)) == 0) + { + int x; + for (x = i + 1; x < as->arg_cnt; x++) + { + size_t m; + + if (as->args[x].short_name[0] == 0) + continue; + + m = strlen (as->args[x].short_name); + if (memcmp (as->args[x].short_name, szTmp, m * sizeof (char)) == 0) + { + break; + } + } + + if (x == as->arg_cnt) + { + if (strlen (lpszArgument) != k) + *nArgPos = k; + else + *nArgPos = 0; + return as->args[i].Id; + } + } + } + + + return -1; +} + +int GetArgumentValue (char **lpszCommandLineArgs, int nArgPos, int *nArgIdx, + int nNoCommandLineArgs, char *lpszValue, int nValueSize) +{ + *lpszValue = 0; + + if (nArgPos) + { + /* Handles the case of no space between parameter code and + value */ + strncpy (lpszValue, &lpszCommandLineArgs[*nArgIdx][nArgPos], nValueSize); + lpszValue[nValueSize - 1] = 0; + return HAS_ARGUMENT; + } + else if (*nArgIdx + 1 < nNoCommandLineArgs) + { + int x = GetArgSepPosOffset (lpszCommandLineArgs[*nArgIdx + 1]); + if (x == 0) + { + /* Handles the case of space between parameter code + and value */ + strncpy (lpszValue, &lpszCommandLineArgs[*nArgIdx + 1][x], nValueSize); + lpszValue[nValueSize - 1] = 0; + (*nArgIdx)++; + return HAS_ARGUMENT; + } + } + + return HAS_NO_ARGUMENT; +} |