/* * Enumerates and returns all IPv6 interfaces on Linux */ static netif *enumIPv6Interfaces(JNIEnv *env, netif *ifs) { FILE *f; char addr6[40], devname[20]; char addr6p[8][5]; int plen, scope, dad_status, if_idx; uint8_t ipv6addr[16]; if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) { while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7], &if_idx, &plen, &scope, &dad_status, devname) != EOF) { struct netif *ifs_ptr = NULL; struct netif *last_ptr = NULL; struct sockaddr_in6 addr; sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); inet_pton(AF_INET6, addr6, ipv6addr); memset(&addr, 0, sizeof(struct sockaddr_in6)); memcpy((void*)addr.sin6_addr.s6_addr, (const void*)ipv6addr, 16); ifs = addif(env, ifs, devname, if_idx, AF_INET6, (struct sockaddr *)&addr, sizeof(struct sockaddr_in6)); } fclose(f); } return ifs; }
int main(void) { struct entry *e; char *file = "file"; e = malloc(sizeof(struct entry)); memset(e, 0, sizeof(struct entry)); e->date = 20100401; e->in = 100; e->out = 200; e = addif(e, "ppp0", 10, 20); e = addif(e, "ppp1", 11, 21); e = addif(e, "ppp2", 12, 22); FILE *fp = fopen(file, "w"); fwrite(e, sizeof(struct entry) + sizeof(struct iface) * e->ifnum, 1, fp); free(e); e = malloc(sizeof(struct entry)); memset(e, 0, sizeof(struct entry)); e->date = 20100402; e->in = 101; e->out = 201; e = addif(e, "tun0", 30, 40); e = addif(e, "tun1", 31, 41); fwrite(e, sizeof(struct entry) + sizeof(struct iface) * e->ifnum, 1, fp); fclose(fp); free(e); print(file); return 0; }
/* * Enumerates and returns all IPv6 interfaces on Solaris */ static netif *enumIPv6Interfaces(JNIEnv *env, netif *ifs) { int sock; struct lifconf ifc; struct lifreq *ifr; int n; char *buf; struct lifnum numifs; unsigned bufsize; sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0); if (sock < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "Failed to create IPv6 socket"); return ifs; } /* * Get the interface count */ numifs.lifn_family = AF_UNSPEC; numifs.lifn_flags = 0; if (ioctl(sock, SIOCGLIFNUM, (char *)&numifs) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFNUM failed"); close(sock); return ifs; } /* * Enumerate the interface configurations */ bufsize = numifs.lifn_count * sizeof (struct lifreq); buf = (char *)malloc(bufsize); if (!buf) { JNU_ThrowOutOfMemoryError(env, "heap allocation failed"); (void) close(sock); return ifs; } ifc.lifc_family = AF_UNSPEC; ifc.lifc_flags = 0; ifc.lifc_len = bufsize; ifc.lifc_buf = buf; if (ioctl(sock, SIOCGLIFCONF, (char *)&ifc) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFCONF failed"); close(sock); free(buf); return ifs; } /* * Iterate through each interface */ ifr = ifc.lifc_req; for (n=0; n<numifs.lifn_count; n++, ifr++) { int index = -1; struct lifreq if2; /* * Ignore non-IPv6 addresses */ if (ifr->lifr_addr.ss_family != AF_INET6) { continue; } /* * Get the index */ memset((char *)&if2, 0, sizeof(if2)); strcpy(if2.lifr_name, ifr->lifr_name); if (ioctl(sock, SIOCGLIFINDEX, (char *)&if2) >= 0) { index = if2.lifr_index; } /* add to the list */ ifs = addif(env, ifs, ifr->lifr_name, index, AF_INET6, (struct sockaddr *)&(ifr->lifr_addr), sizeof(struct sockaddr_in6)); /* * If an exception occurred we return */ if ((*env)->ExceptionOccurred(env)) { close(sock); free(buf); return ifs; } } close(sock); free(buf); return ifs; }
/* * Enumerates and returns all IPv4 interfaces */ static netif *enumIPv4Interfaces(JNIEnv *env, netif *ifs) { int sock; struct ifconf ifc; struct ifreq *ifreqP; char *buf; int numifs; unsigned i; unsigned bufsize; sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { /* * If EPROTONOSUPPORT is returned it means we don't have * IPv4 support so don't throw an exception. */ if (errno != EPROTONOSUPPORT) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "Socket creation failed"); } return ifs; } #ifdef __linux__ /* need to do a dummy SIOCGIFCONF to determine the buffer size. * SIOCGIFCOUNT doesn't work */ ifc.ifc_buf = NULL; if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); close(sock); return ifs; } bufsize = ifc.ifc_len; #else if (ioctl(sock, SIOCGIFNUM, (char *)&numifs) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFNUM failed"); close(sock); return ifs; } bufsize = numifs * sizeof (struct ifreq); #endif /* __linux__ */ buf = (char *)malloc(bufsize); if (!buf) { JNU_ThrowOutOfMemoryError(env, "heap allocation failed"); (void) close(sock); return ifs; } ifc.ifc_len = bufsize; ifc.ifc_buf = buf; if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); (void) close(sock); (void) free(buf); return ifs; } /* * Iterate through each interface */ ifreqP = ifc.ifc_req; for (i=0; i<ifc.ifc_len/sizeof (struct ifreq); i++, ifreqP++) { int index; struct ifreq if2; memset((char *)&if2, 0, sizeof(if2)); strcpy(if2.ifr_name, ifreqP->ifr_name); /* * Try to get the interface index * (Not supported on Solaris 2.6 or 7) */ if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) >= 0) { index = if2.ifr_index; } else { index = -1; } /* * Add to the list */ ifs = addif(env, ifs, ifreqP->ifr_name, index, AF_INET, (struct sockaddr *)&(ifreqP->ifr_addr), sizeof(struct sockaddr_in)); /* * If an exception occurred then free the list */ if ((*env)->ExceptionOccurred(env)) { close(sock); free(buf); freeif(ifs); return NULL; } } /* * Free socket and buffer */ close(sock); free(buf); return ifs; }
/* * Enumerates and returns all IPv4 interfaces */ static netif *enumIPvXInterfaces(JNIEnv *env, netif *ifs, TUint family) { TPckgBuf<TSoInetInterfaceInfo> info; TSoInetInterfaceInfo &i = info(); RSocket r; _LIT(proto, "ip"); TInt err = r.Open(sserv, proto); if (err != KErrNone) { JNU_ThrowByName(env , JNU_JAVANETPKG "SocketException", "Socket creation failed"); return ifs; } /* * Iterate through each interface */ int idx = 1; err = r.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl, 1); while ((err = r.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info)) == KErrNone) { #ifdef _UNICODE TName n = i.iName; TUint8 n8[0x20]; TPtr8 name8(n8, sizeof n8); TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8(name8, n); fprintf(stderr, "Interface proto %s status %x\n", name8.PtrZ(), i.iState); { TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8(name8, i.iTag); fprintf(stderr, "tag %s\n", name8.PtrZ()); } const char *if_name = (const char *)name8.PtrZ(); #else const char *if_name = (const char *)i.iTag.PtrZ(); #endif if (i.iState == EIfUp) { TInetAddr ia = i.iAddress; fprintf(stderr, "Address %x\n", ia.Address()); } if (i.iAddress.Family() == family) { TInetAddr ia = i.iAddress; /* * Add to the list */ ifs = addif(env, ifs, if_name, idx, KAfInet, ia); /* * If an exception occurred then free the list */ if ((*env)->ExceptionOccurred(env)) { freeif(ifs); ifs = NULL; goto done; } } ++idx; } { TPckgBuf<TSoInetIfQuery> q1; TSoInetIfQuery &q = q1(); TInt inum = 1; q.iIndex = inum; while ((err = r.GetOpt(KSoInetIfQueryByIndex, KSolInetIfQuery, q1)) == KErrNone) { fprintf(stderr, "Interface %d up %d\n", inum, q.iIsUp); #ifdef _UNICODE TUint8 n8[0x20]; TPtr8 name8(n8, sizeof n8); TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8(name8, q.iName); fprintf(stderr, "Interface %d name %s\n", inum, name8.PtrZ()); #endif fprintf(stderr, "src addr %x\n", q.iSrcAddr.Address()); fprintf(stderr, "dst addr %x\n", q.iDstAddr.Address()); q.iIndex = ++inum; } } done: r.Close(); return ifs; }