// Get the candidates list of of the real command name whose abbreviation matches to the command specified by the user TOKEN_LIST *GetRealnameCandidate(char *input_name, TOKEN_LIST *real_name_list) { TOKEN_LIST *ret; LIST *o; UINT i; bool ok = false; // Validate arguments if (input_name == NULL || real_name_list == NULL) { return NullToken(); } o = NewListFast(NULL); for (i = 0;i < real_name_list->NumTokens;i++) { char *name = real_name_list->Token[i]; // Search for an exact match with the highest priority first if (StrCmpi(name, input_name) == 0) { Insert(o, name); ok = true; break; } } if (ok == false) { // If there is no command to exact match, check whether it matches to a short form command for (i = 0;i < real_name_list->NumTokens;i++) { char *name = real_name_list->Token[i]; if (IsOmissionName(input_name, name) || IsNameInRealName(input_name, name)) { // A abbreviation is found Insert(o, name); ok = true; } } } if (ok) { // One or more candidate is found ret = ListToTokenList(o); } else { ret = NullToken(); } ReleaseList(o); return ret; }
// Enumerate VLANs TOKEN_LIST *UnixVLanEnum() { TOKEN_LIST *ret; UINT i; if (unix_vlan == NULL) { return NullToken(); } ret = ZeroMalloc(sizeof(TOKEN_LIST)); LockList(unix_vlan); { ret->NumTokens = LIST_NUM(unix_vlan); ret->Token = ZeroMalloc(sizeof(char *) * ret->NumTokens); for (i = 0;i < ret->NumTokens;i++) { UNIX_VLAN_LIST *t = LIST_DATA(unix_vlan, i); ret->Token[i] = CopyStr(t->Name); } } UnlockList(unix_vlan); return ret; }
// Cut out the token from the string (not ignore the blanks between delimiters) TOKEN_LIST *ParseTokenWithNullStr(char *str, char *split_chars) { LIST *o; UINT i, len; BUF *b; char zero = 0; TOKEN_LIST *t; // Validate arguments if (str == NULL) { return NullToken(); } if (split_chars == NULL) { split_chars = DefaultTokenSplitChars(); } b = NewBuf(); o = NewListFast(NULL); len = StrLen(str); for (i = 0;i < (len + 1);i++) { char c = str[i]; bool flag = IsCharInStr(split_chars, c); if (c == '\0') { flag = true; } if (flag == false) { WriteBuf(b, &c, sizeof(char)); } else { WriteBuf(b, &zero, sizeof(char)); Insert(o, CopyStr((char *)b->Buf)); ClearBuf(b); } } t = ZeroMalloc(sizeof(TOKEN_LIST)); t->NumTokens = LIST_NUM(o); t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens); for (i = 0;i < t->NumTokens;i++) { t->Token[i] = LIST_DATA(o, i); } ReleaseList(o); FreeBuf(b); return t; }
// Get the list of parameter names that were included in the entered command TOKEN_LIST *GetCommandNameList(wchar_t *str) { TOKEN_LIST *t; // Validate arguments if (str == NULL) { return NullToken(); } Free(ParseCommandEx(str, L"dummy_str", &t)); return t; }
// Enumerate adapters TOKEN_LIST *SuEnumAdapters(SU *u) { UINT i; UINT ret_size; TOKEN_LIST *ret; // Validate arguments if (u == NULL) { return NullToken(); } Zero(&u->AdapterInfoList, sizeof(u->AdapterInfoList)); if (ReadFile(u->hFile, &u->AdapterInfoList, sizeof(u->AdapterInfoList), &ret_size, NULL) == false || u->AdapterInfoList.Signature != SL_SIGNATURE) { Debug("SuEnumAdapters: ReadFile error.\n"); return NullToken(); } ret = ZeroMalloc(sizeof(TOKEN_LIST)); ret->NumTokens = u->AdapterInfoList.NumAdapters; ret->Token = ZeroMalloc(sizeof(char *) * ret->NumTokens); Debug("SuEnumAdapters: u->AdapterInfoList.NumAdapters = %u\n", u->AdapterInfoList.NumAdapters); for (i = 0; i < ret->NumTokens; i++) { ret->Token[i] = CopyUniToStr(u->AdapterInfoList.Adapters[i].AdapterId); UniPrint(L"%s %u %S\n", u->AdapterInfoList.Adapters[i].AdapterId, u->AdapterInfoList.Adapters[i].MtuSize, u->AdapterInfoList.Adapters[i].FriendlyName); } return ret; }
// Get the string name that begins with the specified name TOKEN_LIST *GetTableNameStartWith(char *str) { UINT i; UINT len; LIST *o; TOKEN_LIST *t; char tmp[MAX_SIZE]; // Validate arguments if (str == NULL) { return NullToken(); } StrCpy(tmp, sizeof(tmp), str); StrUpper(tmp); len = StrLen(tmp); o = NewListFast(NULL); for (i = 0;i < LIST_NUM(TableList);i++) { TABLE *t = LIST_DATA(TableList, i); UINT len2 = StrLen(t->name); if (len2 >= len) { if (Cmp(t->name, tmp, len) == 0) { Insert(o, CopyStr(t->name)); } } } t = ZeroMalloc(sizeof(TOKEN_LIST)); t->NumTokens = LIST_NUM(o); t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens); for (i = 0;i < t->NumTokens;i++) { t->Token[i] = LIST_DATA(o, i); } ReleaseList(o); return t; }
// Parse the command line TOKEN_LIST *ParseCmdLine(char *str) { TOKEN_LIST *t; LIST *o; UINT i, len, wp, mode; char c; char *tmp; bool ignore_space = false; // Validate arguments if (str == NULL) { // There is no token return NullToken(); } o = NewListFast(NULL); tmp = Malloc(StrSize(str) + 32); wp = 0; mode = 0; len = StrLen(str); for (i = 0;i < len;i++) { c = str[i]; switch (mode) { case 0: // Mode to discover the next token if (c == ' ' || c == '\t') { // Advance to the next character } else { // Start of the token if (c == '\"') { if (str[i + 1] == '\"') { // Regard "" as a single " tmp[wp++] = '\"'; i++; } else { // Enable the ignoring space flag for a single " ignore_space = true; } } else { tmp[wp++] = c; } mode = 1; } break; case 1: if (ignore_space == false && (c == ' ' || c == '\t')) { // End of the token tmp[wp++] = 0; wp = 0; Insert(o, CopyStr(tmp)); mode = 0; } else { if (c == '\"') { if (str[i + 1] == '\"') { // Regard "" as a single " tmp[wp++] = L'\"'; i++; } else { if (ignore_space == false) { // Enable the ignoring space flag for a single " ignore_space = true; } else { // Disable the space ignore flag ignore_space = false; } } } else { tmp[wp++] = c; } } break; } } if (wp != 0) { tmp[wp++] = 0; Insert(o, CopyStr(tmp)); } Free(tmp); t = ZeroMalloc(sizeof(TOKEN_LIST)); t->NumTokens = LIST_NUM(o); t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens); for (i = 0;i < t->NumTokens;i++) { t->Token[i] = LIST_DATA(o, i); } ReleaseList(o); return t; }
// コマンドラインをパースする TOKEN_LIST *ParseCmdLine(char *str) { TOKEN_LIST *t; LIST *o; UINT i, len, wp, mode; char c; char *tmp; bool ignore_space = false; // 引数チェック if (str == NULL) { // トークン無し return NullToken(); } o = NewListFast(NULL); tmp = Malloc(StrSize(str) + 32); wp = 0; mode = 0; len = StrLen(str); for (i = 0;i < len;i++) { c = str[i]; switch (mode) { case 0: // 次のトークンを発見するモード if (c == ' ' || c == '\t') { // 次の文字へ進める } else { // トークンの開始 if (c == '\"') { if (str[i + 1] == '\"') { // 2 重の " は 1 個の " 文字として見なす tmp[wp++] = '\"'; i++; } else { // 1 個の " はスペース無視フラグを有効にする ignore_space = true; } } else { tmp[wp++] = c; } mode = 1; } break; case 1: if (ignore_space == false && (c == ' ' || c == '\t')) { // トークンの終了 tmp[wp++] = 0; wp = 0; Insert(o, CopyStr(tmp)); mode = 0; } else { if (c == '\"') { if (str[i + 1] == '\"') { // 2 重の " は 1 個の " 文字として見なす tmp[wp++] = L'\"'; i++; } else { if (ignore_space == false) { // 1 個の " はスペース無視フラグを有効にする ignore_space = true; } else { // スペース無視フラグを無効にする ignore_space = false; } } } else { tmp[wp++] = c; } } break; } } if (wp != 0) { tmp[wp++] = 0; Insert(o, CopyStr(tmp)); } Free(tmp); t = ZeroMalloc(sizeof(TOKEN_LIST)); t->NumTokens = LIST_NUM(o); t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens); for (i = 0;i < t->NumTokens;i++) { t->Token[i] = LIST_DATA(o, i); } ReleaseList(o); return t; }
TOKEN_LIST *GetEthListEx(UINT *total_num_including_hidden, bool enum_normal, bool enum_rawip) { TOKEN_LIST *ret; UINT i; UINT j; UINT dummy_int; MS_ADAPTER_LIST *adapter_list; if (IsEthSupported() == false) { return NULL; } if (enum_normal == false) { return NullToken(); } if (total_num_including_hidden == NULL) { total_num_including_hidden = &dummy_int; } *total_num_including_hidden = 0; Lock(eth_list_lock); InitEthAdaptersList(); adapter_list = MsCreateAdapterList(); ret = ZeroMalloc(sizeof(TOKEN_LIST)); ret->NumTokens = LIST_NUM(eth_list); ret->Token = ZeroMalloc(sizeof(char *) * ret->NumTokens); j = 0; for (i = 0;i < ret->NumTokens;i++) { char tmp[MAX_SIZE]; WP_ADAPTER *a = LIST_DATA(eth_list, i); MS_ADAPTER *msa = NULL; bool show = true; if (Win32EthGetShowAllIf() == false) { msa = MsGetAdapterByGuidFromList(adapter_list, a->Guid); if (InStr(a->Title, "vpn client adapter")) { // Hide virtual NIC for VPN client show = false; } if (InStr(a->Title, "tunnel adapter")) { // Hide tunnel adapter show = false; } if (InStr(a->Title, "teredo tunnel")) { // Hide tunnel adapter show = false; } if (InStr(a->Title, "MS Tunnel Interface")) { // Hide tunnel adapter show = false; } if (InStr(a->Title, "pseudo-interface")) { // Hide tunnel adapter show = false; } } if (msa != NULL) { // Hide except physical Ethernet NIC if (msa->IsNotEthernetLan) { show = false; } MsFreeAdapter(msa); } Win32EthMakeCombinedName(tmp, sizeof(tmp), a->Title, a->Guid); if (show) { ret->Token[j++] = CopyStr(tmp); Debug("%s - %s\n", a->Guid, a->Title); } } *total_num_including_hidden = ret->NumTokens; ret->NumTokens = j; Unlock(eth_list_lock); MsFreeAdapterList(adapter_list); return ret; }