コード例 #1
0
/*
 * 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;
}
コード例 #2
0
ファイル: struct_dyn_size.c プロジェクト: azhuravkin/other
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;
}
コード例 #3
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;

}
コード例 #4
0
/*
 * 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;
}
コード例 #5
0
/*
 * 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;
}