Exceptions in class loading are catched.
[cacao.git] / nat / InetAddressImpl.c
1 /* class: java/net/InetAddressImpl */
2
3 #include <netinet/in.h>
4 #include <netdb.h>
5
6 #define HOSTNMSZ 80
7
8 /*
9  * Class:     java/net/InetAddressImpl
10  * Method:    getHostByAddr
11  * Signature: (I)Ljava/lang/String;
12  */
13 JNIEXPORT struct java_lang_String* JNICALL Java_java_net_InetAddressImpl_getHostByAddr (JNIEnv *env ,  struct java_net_InetAddressImpl* this , s4 addr)
14 {
15     struct hostent* ent;
16
17     if (runverbose)
18         log_text("Java_java_net_InetAddressImpl_getHostByAddr called");
19
20     addr = htonl(addr);
21     ent = gethostbyaddr((char*)&addr, sizeof(s4), AF_INET);
22     if (ent == 0) {
23         exceptionptr = native_new_and_init (class_java_net_UnknownHostException);
24         return 0;
25     }
26
27     return (java_lang_String*)javastring_new_char((char*)ent->h_name);
28 }
29
30 /*
31  * Class:     java/net/InetAddressImpl
32  * Method:    getInetFamily
33  * Signature: ()I
34  */
35 JNIEXPORT s4 JNICALL Java_java_net_InetAddressImpl_getInetFamily (JNIEnv *env ,  struct java_net_InetAddressImpl* this )
36 {
37     if (runverbose)
38         log_text("Java_java_net_InetAddressImpl_getInetFamily called");
39
40     return (AF_INET);
41 }
42
43 /*
44  * Class:     java/net/InetAddressImpl
45  * Method:    getLocalHostName
46  * Signature: ()Ljava/lang/String;
47  */
48 JNIEXPORT struct java_lang_String* JNICALL Java_java_net_InetAddressImpl_getLocalHostName (JNIEnv *env ,  struct java_net_InetAddressImpl* this )
49 {
50     char hostname[HOSTNMSZ];
51
52     if (runverbose)
53         log_text("Java_java_net_InetAddressImpl_getLocalHostName called");
54
55     if (gethostname(hostname, HOSTNMSZ-1) < 0) {
56         return (java_lang_String*)javastring_new_char("localhost");
57     }
58     return (java_lang_String*)javastring_new_char(hostname);
59 }
60
61 /*
62  * Class:     java/net/InetAddressImpl
63  * Method:    lookupAllHostAddr
64  * Signature: (Ljava/lang/String;)[[B
65  */
66 JNIEXPORT java_arrayarray* JNICALL Java_java_net_InetAddressImpl_lookupAllHostAddr (JNIEnv *env ,  struct java_net_InetAddressImpl* this , struct java_lang_String* str)
67 {
68     char *name;
69     struct hostent* ent;
70     java_arrayarray *array;
71     int i;
72     int alength;
73     constant_arraydescriptor arraydesc;
74
75     if (runverbose)
76         log_text("Java_java_net_InetAddressImpl_lookupAllHostAddr called");
77
78     name = javastring_tochar((java_objectheader*)str);
79
80     ent = gethostbyname(name);
81     if (ent == 0) {
82         exceptionptr = native_new_and_init (class_java_net_UnknownHostException);
83         return 0;
84     }
85
86     for (alength = 0; ent->h_addr_list[alength]; alength++)
87         ;
88
89     arraydesc.arraytype = ARRAYTYPE_BYTE;
90     array = builtin_newarray_array(alength, &arraydesc);
91     assert(array != 0);
92
93     for (i = 0; i < alength; i++) {
94         java_bytearray *obj;
95
96         /* Copy in the network address */
97         obj = builtin_newarray_byte(sizeof(s4));
98         assert(obj != 0);
99         *(s4*)obj->data = *(s4*)ent->h_addr_list[i];
100         array->data[i] = (java_arrayheader*)obj;
101     }
102
103     return array;
104 }
105
106 /*
107  * Class:     java/net/InetAddressImpl
108  * Method:    makeAnyLocalAddress
109  * Signature: (Ljava/net/InetAddress;)V
110  */
111 JNIEXPORT void JNICALL Java_java_net_InetAddressImpl_makeAnyLocalAddress (JNIEnv *env ,  struct java_net_InetAddressImpl* this , struct java_net_InetAddress* par1)
112 {
113     if (runverbose)
114         log_text("Java_java_net_InetAddressImpl_makeAnyLocalAddress called");
115
116     /* par1->hostName = 0; */
117     par1->address = htonl(INADDR_ANY);
118     par1->family = AF_INET;
119 }