/* nwtests.c 20-May-96 */ /**************************************************************** * (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * ****************************************************************/ #include "net.h" static int tests_same_arg(char *a, char *b) { while (*a || *b) { int ca = *a++; int cb = *b++; if (ca >= 'a' && ca <= 'z') ca -= 32; if (cb >= 'a' && cb <= 'z') cb -= 32; if (ca != cb) return(0); } return(1); } static void tests_usage(void) { fprintf(stdout, "Usage: TESTS [OLD|NETCALL|E300]\n"); } static int tests_netcall(void) { unsigned char req[4]; unsigned char repl[4]; int asm_rc; int c_rc; memset(req, 0, sizeof(req)); memset(repl, 0, sizeof(repl)); fprintf(stdout, "TEST Net_Call ASM vs C\n"); fprintf(stdout, "Call: INT 21h AH=19h get current drive\n"); fprintf(stdout, "Expected: AL=0 for A:, 1 for B:, 2 for C:, ...\n\n"); asm_rc = Net_Call(0x1900, req, repl); fprintf(stdout, "ASM Net_Call(1900h) rc=%04X drive=%c:\n", asm_rc, 'A' + (asm_rc & 0xff)); c_rc = Net_Call_C(0x1900, req, repl); fprintf(stdout, "C Net_Call_C(1900h) rc=%04X drive=%c:\n", c_rc, 'A' + (c_rc & 0xff)); Net_Call_C_Dump(); if ((asm_rc & 0xff) == (c_rc & 0xff)) fprintf(stdout, "\nNETCALL C basic register test OK\n"); else fprintf(stdout, "\nNETCALL C basic register test FAILED\n"); return(0); } static int tests_old(int argc, char *argv[], int mode) { int level = ncp_17_02(NWCONN, 6); int dirhandle = alloc_temp_dir_handle(0, "SYS:", 'd', NULL); int result = -1; uint8 *path = (argc < 2) ? "SYS:\\TMP" : argv[1]; if (dirhandle > -1) { result = ncp_16_02(dirhandle, "SYSTEM/", NULL, NULL, NULL, NULL); result = ncp_16_02(dirhandle, "SYSTEM", NULL, NULL, NULL, NULL); } fprintf(stdout, "dirhandle=%d, result=%d\n", dirhandle, result); result = redir_device_drive(0x4, "u:", path); fprintf(stdout, "redir path=%s, result=%d\n", path, result); path="Q1"; result = redir_device_drive(0x3, "LPT1", path); fprintf(stdout, "redir path=%s, result=%d\n", path, result); { int k =-1; uint8 devname[20]; uint8 remotename[130]; int devicetyp; while ((result = list_redir(++k, &devicetyp, devname, remotename)) > -1){ fprintf(stdout, "index=%d, dev=%s(%d), %s result=%d\n", k, devname, devicetyp, remotename, result); } } if (level > -1) (void) ncp_17_02(NWCONN, level); return(0); } static void tests_dump_bytes(char *title, unsigned char *p, int len) { int i; fprintf(stdout, "%s", title); for (i = 0; i < len; i++) fprintf(stdout, " %02X", p[i]); fprintf(stdout, "\n"); } static int tests_netcall_e300(void) { struct { uint16 len; uint8 func; } req_asm, req_c; struct { uint16 len; uint8 data[16]; } repl_asm, repl_c; int asm_rc; int c_rc; memset(&req_asm, 0, sizeof(req_asm)); memset(&req_c, 0, sizeof(req_c)); memset(&repl_asm, 0, sizeof(repl_asm)); memset(&repl_c, 0, sizeof(repl_c)); /* * NCP 17/17 Get Login Encryption Key. * This is a known safe bindery/login helper call used by LOGIN/PASSWD code. * Request via old DOS NetWare API AX=E300. */ req_asm.len = 1; req_asm.func = 0x17; repl_asm.len = 8; req_c.len = 1; req_c.func = 0x17; repl_c.len = 8; fprintf(stdout, "TEST Net_Call ASM vs C E300/NCP17/17\n"); fprintf(stdout, "Call: Get Login Encryption Key\n\n"); asm_rc = Net_Call(0xE300, &req_asm, &repl_asm); fprintf(stdout, "ASM Net_Call(E300h) rc=%04X\n", asm_rc); tests_dump_bytes("ASM key:", repl_asm.data, 8); c_rc = Net_Call_C(0xE300, &req_c, &repl_c); fprintf(stdout, "C Net_Call_C(E300h) rc=%04X\n", c_rc); tests_dump_bytes("C key:", repl_c.data, 8); Net_Call_C_Dump(); if ((asm_rc & 0xff) == (c_rc & 0xff)) fprintf(stdout, "\nNETCALL C E300 return test OK\n"); else fprintf(stdout, "\nNETCALL C E300 return test FAILED\n"); /* * Keys can differ per request, so do not require byte-identical keys. * We only compare return status and check that both calls returned 8 bytes. */ return(0); } int func_tests(int argc, char *argv[], int mode) { if (argc < 2) return tests_old(argc, argv, mode); if (tests_same_arg(argv[1], "NETCALL")) return tests_netcall(); if (tests_same_arg(argv[1], "E300") || tests_same_arg(argv[1], "NETCALLE300")) return tests_netcall_e300(); if (tests_same_arg(argv[1], "OLD")) return tests_old(argc - 1, argv + 1, mode); if (tests_same_arg(argv[1], "/?") || tests_same_arg(argv[1], "-?") || tests_same_arg(argv[1], "?")) { tests_usage(); return(0); } return tests_old(argc, argv, mode); }