/* * Display an individual neighbor cache entry */ static void get(char *host) { struct sockaddr_in6 *mysin = &sin_m; struct addrinfo hints, *res; int gai_error; sin_m = blank_sin; (void)memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; gai_error = getaddrinfo(host, NULL, &hints, &res); if (gai_error) { warnx("%s: %s", host, gai_strerror(gai_error)); return; } makeaddr(mysin, res->ai_addr); dump(&mysin->sin6_addr, 0); if (found_entry == 0) { (void)getnameinfo((struct sockaddr *)(void *)mysin, (socklen_t)mysin->sin6_len, host_buf, sizeof(host_buf), NULL ,0, (nflag ? NI_NUMERICHOST : 0)); errx(1, "%s (%s) -- no entry", host, host_buf); } }
/*-----------------------------------------------------------------------------------*/ static void makestrings(void) { uip_ipaddr_t addr, *addrptr; uip_gethostaddr(&addr); makeaddr(&addr, ipaddr); uip_getnetmask(&addr); makeaddr(&addr, netmask); uip_getdraddr(&addr); makeaddr(&addr, gateway); #if WITH_DNS addrptr = resolv_getserver(); if(addrptr != NULL) { makeaddr(addrptr, dnsserver); } #endif /* WITH_DNS */ }
void main(int argc, char *argv[]) { int opt, noauth = 0; char cmdline[1024], *str; while ((opt = getopt(argc, argv, "f")) != EOF) switch (opt) { case 'f': noauth = 1; break; } dup2(0, 1); dup2(0, 2); net = 1; fgets((char *)&cmdline, 1024, stdin); if ((str = strtok((char *)&cmdline, " \n\t\v\r")) == NULL) help(); (void)makeaddr(&from, str); if ((str = strtok((char *)NULL, " \n\t\v\r")) == NULL) help(); (void)makeaddr(&to, str); if ((str = strtok((char *)NULL, " \n\t\v\r")) != NULL) (void)strncpy((char *)&to.pe_tty, str, UT_LINESIZE); if (to.pe_host == NULL) if (getTTY(&to) == -1) exit(1); if (strncmp(from.pe_user, "", UT_NAMESIZE) == 0 || from.pe_host == NULL || strncmp(from.pe_tty, "", UT_LINESIZE) == 0) help(); if (ident(0, &auth) == 0) exit(loop(&from, &to, &auth)); else if (noauth == 0) exit(loop(&from, &to, (struct person *)NULL)); else fprintf(stderr, "write: You cannot be authenticated\n"); exit(1); }
/* * Set an individual neighbor cache entry */ static int set(int argc, char **argv) { register struct sockaddr_in6 *mysin = &sin_m; register struct sockaddr_dl *sdl; register struct rt_msghdr *rtm = &(m_rtmsg.m_rtm); struct addrinfo hints, *res; int gai_error; u_char *ea; char *host = argv[0], *eaddr = argv[1]; getsocket(); argc -= 2; argv += 2; sdl_m = blank_sdl; sin_m = blank_sin; (void)memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; gai_error = getaddrinfo(host, NULL, &hints, &res); if (gai_error) { warnx("%s: %s", host, gai_strerror(gai_error)); return 1; } makeaddr(mysin, res->ai_addr); ea = (u_char *)LLADDR(&sdl_m); if (ndp_ether_aton(eaddr, ea) == 0) sdl_m.sdl_alen = 6; flags = expire_time = 0; while (argc-- > 0) { if (strncmp(argv[0], "temp", 4) == 0) { struct timeval tim; (void)gettimeofday(&tim, 0); expire_time = tim.tv_sec + 20 * 60; } else if (strncmp(argv[0], "proxy", 5) == 0) flags |= RTF_ANNOUNCE; argv++; } if (rtmsg(RTM_GET) < 0) { errx(1, "RTM_GET(%s) failed", host); /* NOTREACHED */ } mysin = (struct sockaddr_in6 *)(void *)(rtm + 1); sdl = (struct sockaddr_dl *)(void *)(RT_ROUNDUP(mysin->sin6_len) + (char *)(void *)mysin); if (IN6_ARE_ADDR_EQUAL(&mysin->sin6_addr, &sin_m.sin6_addr)) { if (sdl->sdl_family == AF_LINK && !(rtm->rtm_flags & RTF_GATEWAY)) { switch (sdl->sdl_type) { case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: case IFT_ISO88024: case IFT_ISO88025: goto overwrite; } } /* * IPv4 arp command retries with sin_other = SIN_PROXY here. */ (void)fprintf(stderr, "set: cannot configure a new entry\n"); return 1; } overwrite: if (sdl->sdl_family != AF_LINK) { warnx("cannot intuit interface index and type for %s", host); return (1); } sdl_m.sdl_type = sdl->sdl_type; sdl_m.sdl_index = sdl->sdl_index; return (rtmsg(RTM_ADD)); }