From: Piotr Caban piotr@codeweavers.com
--- programs/whoami/main.c | 110 +++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 14 deletions(-)
diff --git a/programs/whoami/main.c b/programs/whoami/main.c index f2b44aa652b..6aa6a3f2c19 100644 --- a/programs/whoami/main.c +++ b/programs/whoami/main.c @@ -28,6 +28,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(whoami);
+enum format +{ + FORMAT_TABLE, + FORMAT_LIST, + FORMAT_CSV +}; + static int output_write(const WCHAR* str, int len) { DWORD count; @@ -266,31 +273,106 @@ static int user(void)
int __cdecl wmain(int argc, WCHAR *argv[]) { - if (!argv[1]) - return simple(NameSamCompatible); - - if (argv[1][0] == '/' || argv[1][0] == '-') + enum { - if (!wcsicmp(argv[1] + 1, L"upn")) + ARG_UNSET = 0x0, + ARG_UPN = 0x1, + ARG_FQDN = 0x2, + ARG_LOGONID = 0x4, + ARG_USER = 0x8, + ARG_GROUPS = 0x10, + ARG_CLAIMS = 0x20, + ARG_PRIV = 0x40, + ARG_FO = 0x80, + ARG_NH = 0x100, + ARG_HELP = 0x200, + ARG_ALL = ARG_USER | ARG_GROUPS | ARG_CLAIMS | ARG_PRIV, + }; + DWORD arg = ARG_UNSET, tmp; + enum format format = FORMAT_TABLE; + int i; + + for (i = 1; i < argc; i++) + { + if (argv[i][0] != '/' && argv[i][0] != '-') { - /* Not implemented as of now, therefore fails */ - return simple(NameUserPrincipal); + ERR("invalid argument: %s\n", wine_dbgstr_w(argv[i])); + return 1; } - if (!wcscmp(argv[1] + 1, L"fqdn")) + + if (!wcsicmp(argv[i] + 1, L"upn")) tmp = ARG_UPN; + else if (!wcsicmp(argv[i] + 1, L"fqdn")) tmp = ARG_FQDN; + else if (!wcsicmp(argv[i] + 1, L"logonid")) tmp = ARG_LOGONID; + else if (!wcsicmp(argv[i] + 1, L"user")) tmp = ARG_USER; + else if (!wcsicmp(argv[i] + 1, L"groups")) tmp = ARG_GROUPS; + else if (!wcsicmp(argv[i] + 1, L"claims")) tmp = ARG_CLAIMS; + else if (!wcsicmp(argv[i] + 1, L"priv")) tmp = ARG_PRIV; + else if (!wcsicmp(argv[i] + 1, L"all")) tmp = ARG_ALL; + else if (!wcsicmp(argv[i] + 1, L"fo")) tmp = ARG_FO; + else if (!wcsicmp(argv[i] + 1, L"nh")) tmp = ARG_NH; + else if (!wcsicmp(argv[i] + 1, L"?")) tmp = ARG_HELP; + else { - /* Not implemented as of now, therefore fails */ - return simple(NameFullyQualifiedDN); + ERR("invalid argument: %s\n", wine_dbgstr_w(argv[i])); + return 1; } - if (!wcscmp(argv[1] + 1, L"logonid")) + + if (arg & tmp) { - return logon_id(); + ERR("duplicated options not allowed\n"); + return 1; } - if (!wcscmp(argv[1] + 1, L"user")) + arg |= tmp; + + if (tmp == ARG_FO) { - return user(); + i++; + if (i == argc) + { + ERR("/fo argument expected\n"); + return 1; + } + + if (!wcsicmp(argv[i], L"table")) format = FORMAT_TABLE; + else if (!wcsicmp(argv[i], L"list")) format = FORMAT_LIST; + else if (!wcsicmp(argv[i], L"csv")) format = FORMAT_CSV; + else + { + ERR("invalid format: %s\n", wine_dbgstr_w(argv[i])); + return 1; + } } }
+ if (format == FORMAT_LIST && (arg & ARG_NH)) + { + ERR("/nh can't be used with list format\n"); + return 1; + } + + if (((arg & ARG_ALL) && (arg & ~(ARG_ALL | ARG_FO | ARG_NH))) || + (!(arg & ARG_ALL) && (arg & (arg - 1)))) + { + ERR("syntax error\n"); + return 1; + } + + switch(arg) + { + case ARG_UNSET: + return simple(NameSamCompatible); + case ARG_UPN: + /* Not implemented as of now, therefore fails */ + return simple(NameUserPrincipal); + case ARG_FQDN: + /* Not implemented as of now, therefore fails */ + return simple(NameFullyQualifiedDN); + case ARG_LOGONID: + return logon_id(); + case ARG_USER: + return user(); + } + FIXME("stub\n"); return 1; }