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