ga_echeck.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "gai_hdr.h"
  2. /*
  3. * Basic error checking of flags, family, socket type, and protocol.
  4. */
  5. /* include ga_echeck */
  6. int
  7. ga_echeck(const char *hostname, const char *servname,
  8. int flags, int family, int socktype, int protocol)
  9. {
  10. if (flags & ~(AI_PASSIVE | AI_CANONNAME))
  11. return(EAI_BADFLAGS); /* unknown flag bits */
  12. if (hostname == NULL || hostname[0] == '\0') {
  13. if (servname == NULL || servname[0] == '\0')
  14. return(EAI_NONAME); /* host or service must be specified */
  15. }
  16. switch(family) {
  17. case AF_UNSPEC:
  18. break;
  19. #ifdef IPv4
  20. case AF_INET:
  21. if (socktype != 0 &&
  22. (socktype != SOCK_STREAM &&
  23. socktype != SOCK_DGRAM &&
  24. socktype != SOCK_RAW))
  25. return(EAI_SOCKTYPE); /* invalid socket type */
  26. break;
  27. #endif
  28. #ifdef IPv6
  29. case AF_INET6:
  30. if (socktype != 0 &&
  31. (socktype != SOCK_STREAM &&
  32. socktype != SOCK_DGRAM &&
  33. socktype != SOCK_RAW))
  34. return(EAI_SOCKTYPE); /* invalid socket type */
  35. break;
  36. #endif
  37. #ifdef UNIXdomain
  38. case AF_LOCAL:
  39. if (socktype != 0 &&
  40. (socktype != SOCK_STREAM &&
  41. socktype != SOCK_DGRAM))
  42. return(EAI_SOCKTYPE); /* invalid socket type */
  43. break;
  44. #endif
  45. default:
  46. return(EAI_FAMILY); /* unknown protocol family */
  47. }
  48. return(0);
  49. }
  50. /* end ga_echeck */