/* Editor Settings: expandtabs and use 4 spaces for indentation
* ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: *
* -*- mode: c, c-basic-offset: 4 -*- */
/*
* Copyright Likewise Software 2004-2008
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details. You should have received a copy of the GNU General
* Public License along with this program. If not, see
* .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewisesoftware.com
*/
#ifndef _TESTSRVSVC_H_
#define _TESTSRVSVC_H_
#include
#include
#include
#include
#include "params.h"
struct test;
typedef int (*test_fn)(struct test *t, const wchar16_t *hostname,
const wchar16_t *username, const wchar16_t *password,
struct parameter *options, int optcount);
struct test {
const char *name;
test_fn function;
struct test *next;
};
typedef struct user_creds {
int use_kerberos;
/* krb5 credentials */
char *principal;
char *ccache;
/* ntlm credentials */
char *username;
char *password;
char *domain;
char *workstation;
} UserCreds;
extern NET_CREDS_HANDLE hCreds;
void AddTest(struct test *ft, const char *name, test_fn function);
void SetupSrvSvcTests(struct test *t);
handle_t CreateSrvSvcBinding(handle_t *binding, const wchar16_t *host);
#define STATUS(a, b) \
if((status = (a)) != 0) { \
printf("[\033[31;1mFAILED\033[30;0m] %s test: %s (status=%d)\n", \
active_test, (b), status); \
return; \
}
extern int verbose_mode;
#define WSIZE(a) ((wcslen(a) + 1) * sizeof(wchar16_t))
#define VERBOSE(a) if(verbose_mode) (a)
#define PASSED() printf("[\033[32;1mPASSED\033[31;0m] %s test\n", active_test)
#define FAILED() printf("[\033[31;1mFAILED\033[0m] %s test: ", active_test)
#define netapi_fail(err) { \
const char *name = Win32ErrorToSymbolicName(err); \
if (name) { \
printf("NetApi error: %s (0x%08x)\n", name, err); \
} else { \
printf("NetApi error: 0x%08x\n", err); \
} \
goto done; \
}
#define rpc_fail(err) { \
const char *name = NtStatusToName(err); \
if (name) { \
printf("Rpc error: %s (0x%08x)\n", name, err); \
} else { \
printf("Rpc error: 0x%08x\n", err); \
} \
goto done; \
}
#define SET_SESSION_CREDS(creds) \
do { \
DWORD dwError = ERROR_SUCCESS; \
\
dwError = NetSetCredentials((creds)); \
if (dwError) { \
printf("Failed to set user credentials\n"); \
goto done; \
} \
\
} while(0);
#define RELEASE_SESSION_CREDS \
do { \
DWORD dwError = 0; \
\
dwError = NetSetCredentials(NULL); \
if (dwError) { \
printf("Failed to set release access token on thread\n"); \
goto done; \
} \
\
} while(0);
#define TESTINFO(test, host, user, pass) \
{ \
printf("#\n# Test: %s\n#\n\n", test->name); \
if (verbose_mode) { \
printf("# Test arguments:\n"); \
w16printfw(L"# hostname: %ws\n# username: %ws\n" \
L"# password: %ws\n#\n", host, user, pass); \
} \
}
#define PARAM_INFO_START \
if (verbose_mode) { \
printf("# Test parameters:\n"); \
}
#define PARAM_INFO(name, type, value) \
do { \
char *v = NULL; \
if (!verbose_mode) break; \
\
printf("# %s = ", name); \
switch (type) { \
case pt_string: \
v = strdup((char*)(value)); \
printf("(char*)\"%s\"\n", v); \
break; \
\
case pt_w16string: \
v = awc16stombs((wchar16_t*)(value)); \
printf("(wchar16_t*)\"%s\"\n", v); \
break; \
\
case pt_char: \
printf("(char)\'%c\'\n", (int)(value)); \
break; \
\
case pt_int32: \
printf("(int32) %d (0x%08x)\n", (int32)(value)); \
break; \
\
case pt_uint32: \
printf("(uint32) %d (0x%08x)\n", (uint32)(value)); \
break; \
\
default: \
printf("(unknown type)\n"); \
} \
\
SRVSVC_SAFE_FREE(v); \
} while (0)
#define PARAM_INFO_END \
if (verbose_mode) { \
printf("#\n"); \
}
#define DUMP_PTR(pfx, v) \
if (verbose_mode) { \
printf("%s%s = 0x%08x\n", pfx, #v, (v)); \
}
#define DUMP_WSTR(pfx, v) \
if (verbose_mode) { \
w16printfw(L"%hhs%hhs = \"%ws\"\n", pfx, #v, (v)); \
}
#define DUMP_INT(pfx, v) \
if (verbose_mode) { \
printf("%s%s = %d (0x%08x)\n", pfx, #v, (v), (v)); \
}
#define DUMP_UINT(pfx, v) \
if (verbose_mode) { \
printf("%s%s = %u (0x%08x)\n", pfx, #v, (v), (v)); \
}
#define DUMP_UNICODE_STRING(pfx, v) \
if (verbose_mode) { \
wchar16_t *str = GetFromUnicodeString((v)); \
w16printfw("%hhs%hhs = \"%ws\"\n", pfx, #v, str); \
SRVSVC_SAFE_FREE(str); \
}
#define DUMP_UNICODE_STRING_EX(pfx, v) \
if (verbose_mode) { \
wchar16_t *str = GetFromUnicodeStringEx((v)); \
w16printfw("%hhs%hhs = \"%ws\"\n", pfx, #v, str); \
SRVSVC_SAFE_FREE(str); \
}
#define DUMP_CUSTOM(pfx, v, fn) \
if (verbose_mode) { \
DUMP_PTR(pfx, v); \
fn; \
}
#define INPUT_ARG_PTR(v) DUMP_PTR("> ", v);
#define INPUT_ARG_WSTR(v) DUMP_WSTR("> ", v);
#define INPUT_ARG_INT(v) DUMP_INT("> ", v);
#define INPUT_ARG_UINT(v) DUMP_UINT("> ", v);
#define INPUT_ARG_UNICODE_STRING(v) DUMP_UNICODE_STRING("> ", v);
#define INPUT_ARG_CUSTOM(v, fn) DUMP_CUSTOM("> ", v, fn);
#define OUTPUT_ARG_PTR(v) DUMP_PTR("< ", v);
#define OUTPUT_ARG_WSTR(v) DUMP_WSTR("< ", v);
#define OUTPUT_ARG_INT(v) DUMP_INT("< ", v);
#define OUTPUT_ARG_UINT(v) DUMP_UINT("< ", v);
#define OUTPUT_ARG_UNICODE_STRING(v) DUMP_UNICODE_STRING("< ", v);
#define OUTPUT_ARG_CUSTOM(v, fn) DUMP_CUSTOM("< ", v, fn);
#define RESULT_WSTR(v) DUMP_WSTR("=> ", v);
#define RESULT_INT(v) DUMP_INT("=> ", v);
#define RESULT_UINT(v) DUMP_UINT("=> ", v);
#define CALL_MSRPC(msrpc_call) \
do { \
if (verbose_mode) { \
printf("= Function call:\n= %s\n", #msrpc_call); \
} \
\
msrpc_call; \
printf("= Returned status:\n= %s (0x%08x)\n", \
NtStatusToName(status), status); \
} while (0)
#define CALL_NETAPI(netapi_call) \
do { \
if (verbose_mode) { \
printf("= Function call:\n= %s\n", #netapi_call); \
} \
\
netapi_call; \
printf("= Returned status:\n= %s (0x%08x)\n", \
Win32ErrorToSymbolicName(err), err); \
} while (0)
#endif /* _TESTSRVSVC_H_ */
/*
local variables:
mode: c
c-basic-offset: 4
indent-tabs-mode: nil
tab-width: 4
end:
*/