static boolean_t DHCPv6SocketOpenSocket(DHCPv6SocketRef sock) { if (sock->fd_open) { return (TRUE); } timer_cancel(S_globals->timer_callout); S_globals->read_fd_refcount++; my_log(LOG_DEBUG, "DHCPv6SocketOpenSocket (%s): refcount %d", if_name(sock->if_p), S_globals->read_fd_refcount); sock->fd_open = TRUE; if (S_globals->read_fd_refcount > 1) { /* already open */ return (TRUE); } if (S_globals->read_fd != NULL) { my_log(LOG_DEBUG, "DHCPv6SocketOpenSocket(): socket is still open"); } else { int sockfd; sockfd = open_dhcpv6_socket(S_client_port); if (sockfd < 0) { my_log(LOG_ERR, "DHCPv6SocketOpenSocket: socket() failed, %s", strerror(errno)); goto failed; } my_log(LOG_DEBUG, "DHCPv6SocketOpenSocket(): opened DHCPv6 socket %d", sockfd); /* register as a reader */ S_globals->read_fd = FDCalloutCreate(sockfd, DHCPv6SocketRead, NULL, NULL); } return (TRUE); failed: DHCPv6SocketCloseSocket(sock); return (FALSE); }
STATIC bool RTADVSocketOpenSocket(RTADVSocketRef sock) { if (sock->fd_open) { return (TRUE); } timer_cancel(S_globals->timer_callout); S_globals->read_fd_refcount++; my_log(LOG_INFO, "RTADVSocketOpenSocket (%s): refcount %d", if_name(sock->if_p), S_globals->read_fd_refcount); sock->fd_open = TRUE; if (S_globals->read_fd_refcount > 1) { /* already open */ return (TRUE); } if (S_globals->read_fd != NULL) { my_log(LOG_INFO, "RTADVSocketOpenSocket(): socket is still open"); } else { int sockfd; sockfd = open_rtadv_socket(); if (sockfd < 0) { my_log(LOG_ERR, "RTADVSocketOpenSocket: socket() failed, %s", strerror(errno)); goto failed; } my_log(LOG_INFO, "RTADVSocketOpenSocket(): opened RTADV socket %d", sockfd); /* register as a reader */ S_globals->read_fd = FDCalloutCreate(sockfd, RTADVSocketRead, NULL, NULL); } return (TRUE); failed: RTADVSocketCloseSocket(sock); return (FALSE); }