/** Convert a string of the format "192.168.0.1" to an IP address. @param Str The string representation of IP @param Ip The varible to get IP. @retval EFI_INVALID_PARAMETER The IP string is invalid. @retval EFI_SUCCESS The IP is parsed into the Ip **/ EFI_STATUS NetStringToIp ( IN UINT8 *Str, OUT IP4_ADDR *Ip ) { UINT32 Byte; UINT32 Addr; UINTN Index; *Ip = 0; Addr = 0; for (Index = 0; Index < 4; Index++) { if (!NET_IS_DIGIT (*Str)) { return EFI_INVALID_PARAMETER; } Byte = NetStringToU32 (Str); if (Byte > 255) { return EFI_INVALID_PARAMETER; } Addr = (Addr << 8) | Byte; // // Skip all the digitals and check whether the sepeator is the dot // while (NET_IS_DIGIT (*Str)) { Str++; } if ((Index < 3) && (*Str != '.')) { return EFI_INVALID_PARAMETER; } Str++; } *Ip = Addr; return EFI_SUCCESS; }
/** Convert the decimal dotted IPv4 address into the binary IPv4 address. @param[in] Str The UNICODE string. @param[out] Ip The storage to return the ASCII string. @retval EFI_SUCCESS The binary IP address is returned in Ip. @retval EFI_INVALID_PARAMETER The IP string is malformatted. **/ EFI_STATUS Ip4AsciiStrToIp ( IN CHAR8 *Str, OUT EFI_IPv4_ADDRESS *Ip ) { UINTN Index; UINTN Number; Index = 0; while (*Str != 0) { if (Index > 3) { return EFI_INVALID_PARAMETER; } Number = 0; while (NET_IS_DIGIT (*Str)) { Number = Number * 10 + (*Str - '0'); Str++; } if (Number > 0xFF) { return EFI_INVALID_PARAMETER; } Ip->Addr[Index] = (UINT8) Number; if ((*Str != '\0') && (*Str != '.')) { // // The current character should be either the NULL terminator or // the dot delimiter. // return EFI_INVALID_PARAMETER; } if (*Str == '.') { // // Skip the delimiter. // Str++; } Index++; } if (Index != 4) { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; }
/* * Get month number (-1 on error). */ BOOL TwoDigits(LPCSTR s,WORD& val) { val = 0; if(!NET_IS_DIGIT(s[1])) return FALSE; if(NET_IS_SPACE(*s)) val = ((WORD)(s[0]-'0')); else val = ((WORD)(s[0]-'0'))*10 + ((WORD)(s[1]-'0')); return TRUE; }
/** Convert a string to a UINT32 number. @param Str The string to convert from @return The number get from the string **/ UINT32 NetStringToU32 ( IN UINT8 *Str ) { UINT32 Num; ASSERT (Str != NULL); Num = 0; for (; NET_IS_DIGIT (*Str); Str++) { Num = Num * 10 + (*Str - '0'); } return Num; }
/* *--Full format 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789 Sep 1 1990 - start with ' ' Sep 11 11:59 Sep 11 01:59 - start with 0 Sep 11 1:59 - start with ' ' Dec 12 1989 FCv 23 1990 *--Short format: 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789 f 01:07 - time f 01:7 - minutes with one digit F 15:43 f 2002 - only year *--Expanded format: 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789 *2005-06-20 14:22 *2005-07-08 19:21 *2004-10-14 14:14 *2004-10-14 14:14 */ BOOL net_convert_unix_date(LPSTR& datestr, Time_t& decoded) { SYSTEMTIME st; GetSystemTime(&st); st.wMilliseconds = 0; st.wSecond = 0; st.wDayOfWeek = 0; char *bcol = datestr; /* Column begin */ char *ecol; /* Column end */ //Expanded format (DDDD-) if(NET_IS_DIGIT(bcol[0]) && NET_IS_DIGIT(bcol[1]) && NET_IS_DIGIT(bcol[2]) && NET_IS_DIGIT(bcol[3]) && bcol[4] == '-') { #define CVT( nm, start, end ) bcol[end] = 0; \ st.nm = atoi(bcol+start); \ CHECK( (st.nm == MAX_WORD), FALSE ) CVT(wYear, 0, 4) CVT(wMonth, 5, 7) CVT(wDay, 8, 10) CVT(wHour, 11, 13) CVT(wMinute,14, 16) #undef CVT datestr = bcol + 17; return SystemTimeToFileTime(&st, decoded); } //Month+day or short format // (ecol must be set to char after decoded part) if(NET_TO_UPPER(bcol[0]) == 'F' && NET_IS_SPACE(bcol[1])) { //Short format - ignore month and day ecol = bcol + 2; } else { //Month if(NET_IS_DIGIT(bcol[0]) && NET_IS_DIGIT(bcol[1]) && NET_IS_SPACE(bcol[2])) st.wMonth = AtoI(bcol,MAX_WORD); else st.wMonth = NET_MonthNo(datestr); CHECK((st.wMonth == MAX_WORD), FALSE) bcol = SkipSpace(SkipNSpace(bcol)); CHECK((*bcol == 0), FALSE) //Day ecol = SkipNSpace(bcol); if(*ecol != ' ') return FALSE; *ecol = 0; st.wDay = AtoI(bcol,MAX_WORD); *ecol = ' '; CHECK((st.wDay == MAX_WORD), FALSE) } //Year or time ecol = SkipSpace(ecol); bcol = ecol; if(bcol[2] != ':' && bcol[1] != ':') { //Four digits year ecol = SkipDigit(bcol); CHECK((ecol == bcol), FALSE) *ecol = 0; st.wYear = AtoI(bcol,MAX_WORD); ecol++; CHECK((st.wYear == MAX_WORD), FALSE) //Only first three digits of year with cut last digit if(st.wYear > 190 && st.wYear < 300) { st.wYear *= 10; } st.wSecond = 0; st.wMinute = 0; st.wHour = 0; }
char *SkipDigit(char *l) { while(*l && NET_IS_DIGIT(*l)) l++; return l; }
/** Extract the Root Path option and get the required target information. @param[in] RootPath The RootPath. @param[in] Length Length of the RootPath option payload. @param[in, out] ConfigData The iSCSI attempt configuration data read from a nonvolatile device. @retval EFI_SUCCESS All required information is extracted from the RootPath option. @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath. @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. @retval EFI_INVALID_PARAMETER The RootPath is malformatted. **/ EFI_STATUS IScsiDhcpExtractRootPath ( IN CHAR8 *RootPath, IN UINT8 Length, IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData ) { EFI_STATUS Status; UINT8 IScsiRootPathIdLen; CHAR8 *TmpStr; ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; ISCSI_ROOT_PATH_FIELD *Field; UINT32 FieldIndex; UINT8 Index; ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; EFI_IP_ADDRESS Ip; UINT8 IpMode; ConfigNvData = &ConfigData->SessionConfigData; // // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> // IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID); if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { return EFI_NOT_FOUND; } // // Skip the iSCSI RootPath ID "iscsi:". // RootPath += IScsiRootPathIdLen; Length = (UINT8) (Length - IScsiRootPathIdLen); TmpStr = (CHAR8 *) AllocatePool (Length + 1); if (TmpStr == NULL) { return EFI_OUT_OF_RESOURCES; } CopyMem (TmpStr, RootPath, Length); TmpStr[Length] = '\0'; Index = 0; FieldIndex = RP_FIELD_IDX_SERVERNAME; ZeroMem (&Fields[0], sizeof (Fields)); // // Extract the fields in the Root Path option string. // for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { Fields[FieldIndex].Str = &TmpStr[Index]; } while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) { Index++; } if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) { if (FieldIndex != RP_FIELD_IDX_TARGETNAME) { TmpStr[Index] = '\0'; Index++; } if (Fields[FieldIndex].Str != NULL) { Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str); } } } if (FieldIndex != RP_FIELD_IDX_MAX) { Status = EFI_INVALID_PARAMETER; goto ON_EXIT; } if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) || (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) ) { Status = EFI_INVALID_PARAMETER; goto ON_EXIT; } // // Get the IP address of the target. // Field = &Fields[RP_FIELD_IDX_SERVERNAME]; if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) { IpMode = ConfigNvData->IpMode; } else { IpMode = ConfigData->AutoConfigureMode; } // // Server name is expressed as domain name, just save it. // if ((!NET_IS_DIGIT (*(Field->Str))) && (*(Field->Str) != '[')) { ConfigNvData->DnsMode = TRUE; if (Field->Len > sizeof (ConfigNvData->TargetUrl)) { return EFI_INVALID_PARAMETER; } CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len); ConfigNvData->TargetUrl[Field->Len + 1] = '\0'; } else { ZeroMem(ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl)); Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip); CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS)); if (EFI_ERROR (Status)) { goto ON_EXIT; } } // // Check the protocol type. // Field = &Fields[RP_FIELD_IDX_PROTOCOL]; if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) { Status = EFI_INVALID_PARAMETER; goto ON_EXIT; } // // Get the port of the iSCSI target. // Field = &Fields[RP_FIELD_IDX_PORT]; if (Field->Str != NULL) { ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str); } else { ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; } // // Get the LUN. // Field = &Fields[RP_FIELD_IDX_LUN]; if (Field->Str != NULL) { Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun); if (EFI_ERROR (Status)) { goto ON_EXIT; } } else { ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); } // // Get the target iSCSI Name. // Field = &Fields[RP_FIELD_IDX_TARGETNAME]; if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) { Status = EFI_INVALID_PARAMETER; goto ON_EXIT; } // // Validate the iSCSI name. // Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str)); if (EFI_ERROR (Status)) { goto ON_EXIT; } AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str); ON_EXIT: FreePool (TmpStr); return Status; }
/* 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789 - [RWCEAFMS] IGOR 106278016 May 07 2001 w2ksp2.ex - [RWCEAFMS] SERG 102400 Oct 16 2000 UUUUUU.LZH - [RWCEAFMS] SERG 24576 Jun 14 2001 WINSOC.RAR - [RWCEAFMS] SERG 3335 Jan 27 2001 ZD001206.ARJ - [RWCEAFMS] COM 276043 Mar 05 2002 basa_iva.ARJ - [RWCEAFMS] SERG 7680 Apr 27 2001 12032001.xls - [RWCEAFMS] COM 1142784 Jan 29 16:03 Дай мне быть с тобою рядом (Фристайл).mp3 - [RWCEAFMS] COM 12288 Dec 20 2001 nds10009.xls - [RWCEAFMS] COM 30000 Jul 16 2002 TRACK22.WAV - [RWCEAFMS] ASDU 22528 Dec 16 2002 '_'-Rбв вRЄ.xls - [RWCEAFMS] COM 96256 Jul 09 2001 ZP010621.XLS - [RWCEAFMS] COM 266240 Jul 27 2001 rgp18i.zip d [RWCEAFMS] SERG 512 Mar 13 14:29 baza_arz d [RWCEAFMS] SERG 512 Mar 10 01:09 chebocs d [RWCEAFMS] SERG 512 Mar 10 01:09 volgskoe d [RWCEAFMS] PHD3 512 Mar 10 01:09 a d [RWCEAFMS] TB1 512 Mar 13 16:08 GEYKO d [RWCEAFMS] 0 512 Apr 11 08:47 admin d [RWCEAFMS] 0 512 Apr 06 04:12 aviso -[RWCEMFA] 1 lipinl1 253 Apr 11 00:20 jednicka.asm */ BOOL WINAPI idPRParceNETWARE(const FTPServerInfo* Server, FTPFileInfo* p, char *entry, int entry_len) { NET_FileEntryInfo entry_info; BOOL remove_size = FALSE; char *m; if(entry_len < 43) return FALSE; //Dir if(NET_TO_UPPER(*entry) == 'D') { entry_info.FileType = NET_DIRECTORY; remove_size = TRUE; /* size is not useful */ } else //File if(NET_TO_UPPER(*entry) == '-') { //Plain file } else //unk return FALSE; //Attrs entry++; if(NET_IS_SPACE(*entry)) entry++; if(*entry != '[') return FALSE; m = SkipNX(entry,']'); if(*m != ']') return FALSE; entry = m+1; entry_info.FindData.dwFileAttributes = 0; //Owner entry = SkipSpace(entry); m = SkipNSpace(entry); StrCpy(entry_info.FTPOwner, entry, (int)(m-entry+1)); entry = SkipSpace(m); if(!NET_IS_DIGIT(*entry)) { m = SkipNSpace(entry); StrCpy(entry_info.FTPOwner, entry, (int)(m-entry+1)); entry = SkipSpace(m); } //Size m = SkipDigit(entry); if(m[0] != ' ') return FALSE; *m = 0; entry_info.size = AtoI(entry, (int64_t)-1); *m = ' '; if(entry_info.size == -1) return FALSE; entry = SkipSpace(m); //Date if(!net_convert_unix_date(entry, entry_info.date)) return FALSE; entry = SkipSpace(entry); //FileName StrCpy(entry_info.FindData.cFileName, entry, ARRAYSIZE(entry_info.FindData.cFileName)); if(!entry_info.FindData.cFileName[0]) return FALSE; if(remove_size) entry_info.size = 0; return ConvertEntry(&entry_info,p); }
/** Parse the NULL terminated ASCII string of multicast option. @param[in] Str The pointer to the Ascii string of multicast option. @param[in] ExtInfo The pointer to the option information to be filled. @retval EFI_SUCCESS Parse the multicast option successfully. @retval EFI_INVALID_PARAMETER The string is malformatted. @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to lack of resources. **/ EFI_STATUS Mtftp6ParseMcastOption ( IN UINT8 *Str, IN MTFTP6_EXT_OPTION_INFO *ExtInfo ) { EFI_STATUS Status; UINT32 Num; CHAR8 *Ip6Str; CHAR8 *TempStr; // // The multicast option is formated like "addr,port,mc" // The server can also omit the ip and port, use ",,1" // if (*Str == ',') { ZeroMem (&ExtInfo->McastIp, sizeof (EFI_IPv6_ADDRESS)); } else { Ip6Str = (CHAR8 *) AllocateCopyPool (AsciiStrSize ((CHAR8 *) Str), Str); if (Ip6Str == NULL) { return EFI_OUT_OF_RESOURCES; } // // The IPv6 address locates before comma in the input Str. // TempStr = Ip6Str; while ((*TempStr != '\0') && (*TempStr != ',')) { TempStr++; } *TempStr = '\0'; Status = NetLibAsciiStrToIp6 (Ip6Str, &ExtInfo->McastIp); FreePool (Ip6Str); if (EFI_ERROR (Status)) { return Status; } while ((*Str != '\0') && (*Str != ',')) { Str++; } } if (*Str != ',') { return EFI_INVALID_PARAMETER; } Str++; // // Convert the port setting. the server can send us a port number or // empty string. such as the port in ",,1" // if (*Str == ',') { ExtInfo->McastPort = 0; } else { Num = (UINT32) AsciiStrDecimalToUintn ((CHAR8 *) Str); if (Num > 65535) { return EFI_INVALID_PARAMETER; } ExtInfo->McastPort = (UINT16) Num; while (NET_IS_DIGIT (*Str)) { Str++; } } if (*Str != ',') { return EFI_INVALID_PARAMETER; } Str++; // // Check the master/slave setting, 1 for master, 0 for slave. // Num = (UINT32) AsciiStrDecimalToUintn ((CHAR8 *) Str); if (Num != 0 && Num != 1) { return EFI_INVALID_PARAMETER; } ExtInfo->IsMaster = (BOOLEAN) (Num == 1); while (NET_IS_DIGIT (*Str)) { Str++; } if (*Str != '\0') { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; }