Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

120 rader
3.0 KiB

  1. /*******************************************************************************
  2. WINC3400 Wireless Driver
  3. File Name:
  4. inet_addr.c
  5. Summary:
  6. Implementation of standard inet_addr function.
  7. Description:
  8. Implementation of standard inet_addr function.
  9. *******************************************************************************/
  10. //DOM-IGNORE-BEGIN
  11. /*******************************************************************************
  12. * Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries.
  13. *
  14. * Subject to your compliance with these terms, you may use Microchip software
  15. * and any derivatives exclusively with Microchip products. It is your
  16. * responsibility to comply with third party license terms applicable to your
  17. * use of third party software (including open source software) that may
  18. * accompany Microchip software.
  19. *
  20. * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
  21. * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
  22. * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
  23. * PARTICULAR PURPOSE.
  24. *
  25. * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
  26. * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
  27. * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
  28. * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
  29. * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
  30. * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
  31. * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
  32. *******************************************************************************/
  33. #include <stdint.h>
  34. #include "socket.h"
  35. in_addr_t inet_addr(const char *cp)
  36. {
  37. uint8_t i,l;
  38. uint16_t t;
  39. uint32_t ip;
  40. char c;
  41. ip = 0;
  42. for (i=0; i<4; i++)
  43. {
  44. t = 0;
  45. ip >>= 8;
  46. // Count non-delimiter or terminator characters
  47. for (l=0; l<4; l++)
  48. {
  49. c = cp[l];
  50. if (('.' == c) || ('\0' == c))
  51. {
  52. break;
  53. }
  54. }
  55. // There must be 1 to 3 characters
  56. if ((0 == l) || (4 == l))
  57. {
  58. return 0;
  59. }
  60. c = *cp++;
  61. // First digit can't be '0' unless it's the only one
  62. if ((l > 1) && (c == '0'))
  63. {
  64. return 0;
  65. }
  66. while(l--)
  67. {
  68. // Each digit must be decimal
  69. if ((c < '0') || (c > '9'))
  70. {
  71. return 0;
  72. }
  73. t = (t * 10) + (c - '0');
  74. c = *cp++;
  75. }
  76. // Total accumulated number must be less than 256
  77. if (t > 255)
  78. {
  79. return 0;
  80. }
  81. // Pack number into 32 bit IP address representation
  82. ip |= ((uint32_t)t << 24);
  83. // First three numbers must terminate with '.', last one with '\0's
  84. if ((('\0' == c) && (i != 3)) || (('\0' != c) && (i == 3)))
  85. {
  86. return 0;
  87. }
  88. }
  89. return ip;
  90. }
  91. //DOM-IGNORE-END