int ParseAddr(const char *s, struct u_addr *addr, u_char allow) { if (strchr(s, '/')) return (FALSE); /* Get IP address part; if that fails, try looking up hostname */ if ((allow & ALLOW_IPV4) && inet_pton(AF_INET, s, &addr->u.ip4)) { addr->family = AF_INET; } else if ((allow & ALLOW_IPV6) && inet_pton(AF_INET6, s, &addr->u.ip6)) { addr->family = AF_INET6; } else if ((allow & ALLOW_IPV4) && !GetAnyIpAddress(addr, s)) { addr->family = AF_INET; } else if (allow & ALLOW_IPV4) { struct hostent *hptr; int k; if ((hptr = gethostbyname(s)) == NULL) { return (FALSE); } for (k = 0; hptr->h_addr_list[k]; k++); if (k == 0) k = 1; memcpy(&addr->u.ip4, hptr->h_addr_list[random() % k], sizeof(addr->u.ip4)); addr->family = AF_INET; } else { return (FALSE); } return (TRUE); }
void IpcpInit(Bund b) { IpcpState const ipcp = &b->ipcp; /* Init state machine */ memset(ipcp, 0, sizeof(*ipcp)); FsmInit(&ipcp->fsm, &gIpcpFsmType, b); /* Come up with a default IP address for my side of the link */ u_rangeclear(&ipcp->conf.self_allow); GetAnyIpAddress(&ipcp->conf.self_allow.addr, NULL); #ifdef USE_NG_VJC /* Default we want VJ comp */ Enable(&ipcp->conf.options, IPCP_CONF_VJCOMP); Accept(&ipcp->conf.options, IPCP_CONF_VJCOMP); #endif }