diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/madge/dll/mdgmpdlg.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/private/ntos/ndis/madge/dll/mdgmpdlg.c b/private/ntos/ndis/madge/dll/mdgmpdlg.c new file mode 100644 index 000000000..f0f27797f --- /dev/null +++ b/private/ntos/ndis/madge/dll/mdgmpdlg.c @@ -0,0 +1,124 @@ + +#include <ntddk.h> + +#include <stdio.h> +#include <ctype.h> + +#include "mdgmpdlg.upd" + +typedef int BOOL; +typedef unsigned long DWORD; +typedef unsigned char BYTE; + + +// +// Identification string for MVER. +// + +static char MVerString[] = MVER_STRING; + +BOOL +MadgeLAACheck(DWORD cargs, + LPSTR lpszArgs[], + LPSTR *lpszTextOut) + { + /* We are expecting one argument, a node address, and we want to parse */ + /* it, check it, and return true/false. */ + /* NB According to the book, the arguments are not Unicode, so we can */ + /* use old style routines. */ + + static char buffer[50] = ""; + BYTE nodeaddr[6] = { 0, }; + char ch; + int nibbles; + int nibble; + BOOL hyphens, hyphen; + + *lpszTextOut = buffer; + + if (cargs != 1) + { + sprintf(buffer, "MadgeLAACheck: too few arguments"); + return FALSE; + } + + /* We have the correct number of arguments, now parse it */ + + hyphens = FALSE; + hyphen = FALSE; + nibbles = 0; + + while (nibbles < 12) + { + ch = *(lpszArgs[0]++); + + /* First make sure the hyphenation of the node address is correct. */ + /* We allow either fully hyphenated or not hyphenated, but not a */ + /* mixture. */ + + if ((nibbles % 2) == 0) + { + if (nibbles == 2) + { + if (ch == '-' && !hyphen) + { + hyphens = TRUE; + hyphen = TRUE; + continue; + } + } + else + if (hyphens) + if (ch == '-') + if (!hyphen) + { + hyphen = TRUE; + continue; + } + else + break; + else + if (!hyphen) + break; + } + else + hyphen = FALSE; + + if (ch >= '0' && ch <= '9') + nibble = ch - '0'; + else if (ch >= 'A' && ch <= 'F') + nibble = ch - 'A' + 10; + else if (ch >= 'a' && ch <= 'f') + nibble = ch - 'a' + 10; + else + break; + + /* So we've got a valid nibble - now slot it into place */ + + nodeaddr[nibbles / 2] |= nibble << (nibbles % 2 ? 0 : 4); + + nibbles++; + } + + if ((nibbles != 12) || (*lpszArgs[0] != '\0' && !isspace(*lpszArgs[0]))) + { + sprintf(buffer, "Bad node address. Use xx-xx-xx-xx-xx-xx."); + return FALSE; + } + + /* We have a valid node address - just check that it is good as a LAA */ + + if ((nodeaddr[0] & 0xC0) != 0x40) + { + sprintf(buffer, "Illegal LAA (first digit must be between 4 and 7)"); + return FALSE; + } + + sprintf(buffer, "MADGE_STATUS_SUCCESS"); + + return TRUE; + } + +/*****************************************************************************/ +/* End of file. */ +/*****************************************************************************/ |