ga_serv.lc 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "gai_hdr.h"## 1 ##src/libgai/ga_serv.c##
  2. /*## 2 ##src/libgai/ga_serv.c##
  3. * This function handles the service string.## 3 ##src/libgai/ga_serv.c##
  4. */## 4 ##src/libgai/ga_serv.c##
  5. /* include ga_serv */
  6. int## 5 ##src/libgai/ga_serv.c##
  7. ga_serv(struct addrinfo *aihead, const struct addrinfo *hintsp,## 6 ##src/libgai/ga_serv.c##
  8. const char *serv)## 7 ##src/libgai/ga_serv.c##
  9. {## 8 ##src/libgai/ga_serv.c##
  10. int port, rc, nfound;## 9 ##src/libgai/ga_serv.c##
  11. struct servent *sptr;## 10 ##src/libgai/ga_serv.c##
  12. nfound = 0;## 11 ##src/libgai/ga_serv.c##
  13. if (isdigit(serv[0])) { /* check for port number string first */## 12 ##src/libgai/ga_serv.c##
  14. port = htons(atoi(serv));## 13 ##src/libgai/ga_serv.c##
  15. if (hintsp->ai_socktype) {## 14 ##src/libgai/ga_serv.c##
  16. /* 4caller specifies socket type */## 15 ##src/libgai/ga_serv.c##
  17. if ((rc = ga_port(aihead, port, hintsp->ai_socktype)) < 0)## 16 ##src/libgai/ga_serv.c##
  18. return (EAI_MEMORY);## 17 ##src/libgai/ga_serv.c##
  19. nfound += rc;## 18 ##src/libgai/ga_serv.c##
  20. } else {## 19 ##src/libgai/ga_serv.c##
  21. /* 4caller does not specify socket type */## 20 ##src/libgai/ga_serv.c##
  22. if ((rc = ga_port(aihead, port, SOCK_STREAM)) < 0)## 21 ##src/libgai/ga_serv.c##
  23. return (EAI_MEMORY);## 22 ##src/libgai/ga_serv.c##
  24. nfound += rc;## 23 ##src/libgai/ga_serv.c##
  25. if ((rc = ga_port(aihead, port, SOCK_DGRAM)) < 0)## 24 ##src/libgai/ga_serv.c##
  26. return (EAI_MEMORY);## 25 ##src/libgai/ga_serv.c##
  27. nfound += rc;## 26 ##src/libgai/ga_serv.c##
  28. }## 27 ##src/libgai/ga_serv.c##
  29. } else {## 28 ##src/libgai/ga_serv.c##
  30. /* 4try service name, TCP then UDP */## 29 ##src/libgai/ga_serv.c##
  31. if (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_STREAM) {## 30 ##src/libgai/ga_serv.c##
  32. if ((sptr = getservbyname(serv, "tcp")) != NULL) {## 31 ##src/libgai/ga_serv.c##
  33. if ((rc = ga_port(aihead, sptr->s_port, SOCK_STREAM)) < 0)## 32 ##src/libgai/ga_serv.c##
  34. return (EAI_MEMORY);## 33 ##src/libgai/ga_serv.c##
  35. nfound += rc;## 34 ##src/libgai/ga_serv.c##
  36. }## 35 ##src/libgai/ga_serv.c##
  37. }## 36 ##src/libgai/ga_serv.c##
  38. if (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_DGRAM) {## 37 ##src/libgai/ga_serv.c##
  39. if ((sptr = getservbyname(serv, "udp")) != NULL) {## 38 ##src/libgai/ga_serv.c##
  40. if ((rc = ga_port(aihead, sptr->s_port, SOCK_DGRAM)) < 0)## 39 ##src/libgai/ga_serv.c##
  41. return (EAI_MEMORY);## 40 ##src/libgai/ga_serv.c##
  42. nfound += rc;## 41 ##src/libgai/ga_serv.c##
  43. }## 42 ##src/libgai/ga_serv.c##
  44. }## 43 ##src/libgai/ga_serv.c##
  45. }## 44 ##src/libgai/ga_serv.c##
  46. if (nfound == 0) {## 45 ##src/libgai/ga_serv.c##
  47. if (hintsp->ai_socktype == 0)## 46 ##src/libgai/ga_serv.c##
  48. return (EAI_NONAME); /* all calls to getservbyname() failed */## 47 ##src/libgai/ga_serv.c##
  49. else## 48 ##src/libgai/ga_serv.c##
  50. return (EAI_SERVICE); /* service not supported for socket type */## 49 ##src/libgai/ga_serv.c##
  51. }## 50 ##src/libgai/ga_serv.c##
  52. return (0);## 51 ##src/libgai/ga_serv.c##
  53. }## 52 ##src/libgai/ga_serv.c##
  54. /* end ga_serv */