|  | /* | 
|  | * This file is part of the UCB release of Plan 9. It is subject to the license | 
|  | * terms in the LICENSE file found in the top-level directory of this | 
|  | * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
|  | * part of the UCB release of Plan 9, including this file, may be copied, | 
|  | * modified, propagated, or distributed except according to the terms contained | 
|  | * in the LICENSE file. | 
|  | */ | 
|  | #define _GNU_SOURCE | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include <iplib/iplib.h> | 
|  | #include <parlib/parlib.h> | 
|  | #include <signal.h> | 
|  | #include <stdio.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | // find first ip addr that isn't the friggin loopback address | 
|  | // unless there are no others | 
|  | int myipaddr(uint8_t *ip, char *net) | 
|  | { | 
|  | struct iplifc *lifc; | 
|  | struct ipifc *ifc; | 
|  |  | 
|  | lifc = get_first_noloop_iplifc(net, &ifc); | 
|  | if (!lifc) { | 
|  | ipmove(ip, IPnoaddr); | 
|  | return -1; | 
|  | } | 
|  | ipmove(ip, lifc->ip); | 
|  | free_ipifc(ifc); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /* Finds the default router from net/iproute, stores the full IP address | 
|  | * (IPaddrlen) in addr.  Returns 0 on success. */ | 
|  | int my_router_addr(uint8_t *addr, char *net) | 
|  | { | 
|  | char *line = NULL; | 
|  | size_t len = 0; | 
|  | ssize_t read; | 
|  | FILE *fp; | 
|  | char *p, *str; | 
|  | uint8_t ipaddr[IPaddrlen]; | 
|  | uint8_t v4addr[IPaddrlen]; | 
|  | char netpath[MAX_PATH_LEN]; | 
|  | int ret = -1; | 
|  |  | 
|  | if (!net) | 
|  | net = "/net"; | 
|  | snprintf(netpath, sizeof(netpath), "%s/iproute", net); | 
|  | fp = fopen(netpath, "r"); | 
|  | if (!fp) | 
|  | return -1; | 
|  | while ((read = getline(&line, &len, fp)) != -1) { | 
|  | p = strchr(line, ' '); | 
|  | if (!p) { | 
|  | werrstr("Malformed line, no initial space"); | 
|  | goto out; | 
|  | } | 
|  | *p++ = 0; | 
|  | parseip(ipaddr, line); | 
|  | if (isv4(ipaddr)) { | 
|  | v6tov4(v4addr, ipaddr); | 
|  | if (!equivip4(v4addr, IPnoaddr)) | 
|  | continue; | 
|  | } else { | 
|  | if (!equivip6(ipaddr, IPnoaddr)) | 
|  | continue; | 
|  | } | 
|  | p = strchr(p, ' '); | 
|  | if (!p) { | 
|  | werrstr("Malformed line, no second space %s", line); | 
|  | goto out; | 
|  | } | 
|  | p++; | 
|  | str = p; | 
|  | p = strchr(p, ' '); | 
|  | if (!p) { | 
|  | werrstr("Malformed line, no third space %s", line); | 
|  | goto out; | 
|  | } | 
|  | *p++ = 0; | 
|  | parseip(addr, str); | 
|  | ret = 0; | 
|  | } | 
|  | out: | 
|  | free(line); | 
|  | fclose(fp); | 
|  | return ret; | 
|  | } |