static int fpm_socket_af_inet_socket_by_addr(struct fpm_worker_pool_s *wp, const char *addr, const char *port) /* {{{ */ { struct addrinfo hints, *servinfo, *p; char tmpbuf[INET6_ADDRSTRLEN]; int status; int sock = -1; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((status = getaddrinfo(addr, port, &hints, &servinfo)) != 0) { zlog(ZLOG_ERROR, "getaddrinfo: %s\n", gai_strerror(status)); return -1; } for (p = servinfo; p != NULL; p = p->ai_next) { inet_ntop(p->ai_family, fpm_get_in_addr(p->ai_addr), tmpbuf, INET6_ADDRSTRLEN); if (sock < 0) { if ((sock = fpm_sockets_get_listening_socket(wp, p->ai_addr, p->ai_addrlen)) != -1) { zlog(ZLOG_DEBUG, "Found address for %s, socket opened on %s", addr, tmpbuf); } } else { zlog(ZLOG_WARNING, "Found multiple addresses for %s, %s ignored", addr, tmpbuf); } } freeaddrinfo(servinfo); return sock; }
static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */ { struct addrinfo hints, *servinfo, *p; char *dup_address = strdup(wp->config->listen_address); char *port_str = strrchr(dup_address, ':'); char *addr = NULL; char tmpbuf[INET6_ADDRSTRLEN]; int addr_len; int port = 0; int sock = -1; int status; if (port_str) { /* this is host:port pair */ *port_str++ = '\0'; port = atoi(port_str); addr = dup_address; } else if (strlen(dup_address) == strspn(dup_address, "0123456789")) { /* this is port */ port = atoi(dup_address); port_str = dup_address; /* IPv6 catch-all + IPv4-mapped */ addr = "::"; } if (port == 0) { zlog(ZLOG_ERROR, "invalid port value '%s'", port_str); return -1; } /* strip brackets from address for getaddrinfo */ addr_len = strlen(addr); if (addr[0] == '[' && addr[addr_len - 1] == ']') { addr[addr_len - 1] = '\0'; addr++; } memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((status = getaddrinfo(addr, port_str, &hints, &servinfo)) != 0) { zlog(ZLOG_ERROR, "getaddrinfo: %s\n", gai_strerror(status)); return -1; } for (p = servinfo; p != NULL; p = p->ai_next) { inet_ntop(p->ai_family, fpm_get_in_addr(p->ai_addr), tmpbuf, INET6_ADDRSTRLEN); if (sock < 0) { if ((sock = fpm_sockets_get_listening_socket(wp, p->ai_addr, p->ai_addrlen)) != -1) { zlog(ZLOG_DEBUG, "Found address for %s, socket opened on %s", addr, tmpbuf); } } else { zlog(ZLOG_WARNING, "Found multiple addresses for %s, %s ignored", addr, tmpbuf); } } free(dup_address); freeaddrinfo(servinfo); return sock; }
static int fpm_socket_af_unix_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */ { struct sockaddr_un sa_un; memset(&sa_un, 0, sizeof(sa_un)); strlcpy(sa_un.sun_path, wp->config->listen_address, sizeof(sa_un.sun_path)); sa_un.sun_family = AF_UNIX; return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_un, sizeof(struct sockaddr_un)); }
static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) { struct sockaddr_in sa_in; char *dup_address = strdup(wp->config->listen_address); char *port_str = strchr(dup_address, ':'); char *addr = NULL; int port = 0; if (port_str) { /* this is host:port pair */ *port_str++ = '\0'; port = atoi(port_str); addr = dup_address; } else if (strlen(dup_address) == strspn(dup_address, "0123456789")) { /* this is port */ port = atoi(dup_address); port_str = dup_address; } if (port == 0) { zlog(ZLOG_STUFF, ZLOG_ERROR, "invalid port value '%s'", port_str); return -1; } memset(&sa_in, 0, sizeof(sa_in)); if (addr) { sa_in.sin_addr.s_addr = inet_addr(addr); if (sa_in.sin_addr.s_addr == INADDR_NONE) { /* do resolve */ if (0 > fpm_sockets_resolve_af_inet(addr, NULL, &sa_in)) { return -1; } zlog(ZLOG_STUFF, ZLOG_NOTICE, "address '%s' resolved as %u.%u.%u.%u", addr, IPQUAD(&sa_in.sin_addr)); } } else { sa_in.sin_addr.s_addr = htonl(INADDR_ANY); } sa_in.sin_family = AF_INET; sa_in.sin_port = htons(port); free(dup_address); return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_in, sizeof(struct sockaddr_in)); }
static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */ { struct addrinfo hints, *servinfo, *p; char *dup_address = strdup(wp->config->listen_address); // 获取port char *port_str = strrchr(dup_address, ':'); char *addr = NULL; char tmpbuf[INET6_ADDRSTRLEN]; int addr_len; int port = 0; int sock = -1; int status; if (port_str) { /* this is host:port pair */ *port_str++ = '\0'; port = atoi(port_str); addr = dup_address; } else if (strlen(dup_address) == strspn(dup_address, "0123456789")) { /* this is port */ port = atoi(dup_address); port_str = dup_address; } if (port == 0) { zlog(ZLOG_ERROR, "invalid port value '%s'", port_str); return -1; } if (!addr) { /* no address: default documented behavior, all IPv4 addresses */ struct sockaddr_in sa_in; memset(&sa_in, 0, sizeof(sa_in)); sa_in.sin_family = AF_INET; sa_in.sin_port = htons(port); sa_in.sin_addr.s_addr = htonl(INADDR_ANY); free(dup_address); return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_in, sizeof(struct sockaddr_in)); } /* strip brackets from address for getaddrinfo */ addr_len = strlen(addr); if (addr[0] == '[' && addr[addr_len - 1] == ']') { addr[addr_len - 1] = '\0'; addr++; } memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; zlog(ZLOG_NOTICE, "pa -> func : 监听socket, addr[%s]", addr); if ((status = getaddrinfo(addr, port_str, &hints, &servinfo)) != 0) { zlog(ZLOG_ERROR, "getaddrinfo: %s\n", gai_strerror(status)); free(dup_address); return -1; } for (p = servinfo; p != NULL; p = p->ai_next) { inet_ntop(p->ai_family, fpm_get_in_addr(p->ai_addr), tmpbuf, INET6_ADDRSTRLEN); if (sock < 0) { if ((sock = fpm_sockets_get_listening_socket(wp, p->ai_addr, p->ai_addrlen)) != -1) { zlog(ZLOG_DEBUG, "Found address for %s, socket opened on %s", dup_address, tmpbuf); } } else { zlog(ZLOG_WARNING, "Found multiple addresses for %s, %s ignored", dup_address, tmpbuf); } } free(dup_address); freeaddrinfo(servinfo); return sock; }