Skip to content

Commit e05a974

Browse files
committed
Add JavaCritical implementation
1 parent f0ee31d commit e05a974

5 files changed

Lines changed: 177 additions & 1 deletion

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
}
88

99
setGroup("net.elytrium")
10-
setVersion("1.0.0")
10+
setVersion("1.0.1-SNAPSHOT")
1111

1212
sourceSets {
1313
main.getResources().srcDir("build/natives/lib")

src/main/c/src/pcap.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ typedef struct {
2727

2828
thread_local char errbuf[PCAP_ERRBUF_SIZE];
2929

30+
JNIEXPORT jboolean JNICALL Java_net_elytrium_pcap_PcapNative_isJavaCritical(JNIEnv *env, jclass class) {
31+
return 0;
32+
}
33+
3034
JNIEXPORT jstring JNICALL Java_net_elytrium_pcap_PcapNative_getErrorBuffer(JNIEnv *env, jclass class) {
3135
return (*env)->NewStringUTF(env, errbuf);
3236
}

src/main/c/src/pcap_javacritical.c

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*
2+
* Copyright (C) 2022 - 2023 Elytrium
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU Affero General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU Affero General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU Affero General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
#include <jni.h>
19+
#include <pcap/pcap.h>
20+
21+
JNIEXPORT jboolean JNICALL JavaCritical_net_elytrium_pcap_PcapNative_isJavaCritical() {
22+
return 1;
23+
}
24+
25+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_activate(jlong handle) {
26+
return pcap_activate((pcap_t *) handle);
27+
}
28+
29+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_freeAllDevs(jlong handle) {
30+
pcap_freealldevs((pcap_if_t *) handle);
31+
}
32+
33+
JNIEXPORT jlong JNICALL JavaCritical_net_elytrium_pcap_PcapNative_openDead(jint linktype, jint snaplen) {
34+
return (jlong) pcap_open_dead(linktype, snaplen);
35+
}
36+
37+
JNIEXPORT jlong JNICALL JavaCritical_net_elytrium_pcap_PcapNative_openDeadWithTstampPrecision(jint linktype, jint snaplen, jint precision) {
38+
return (jlong) pcap_open_dead_with_tstamp_precision(linktype, snaplen, precision);
39+
}
40+
41+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_close(jlong handle) {
42+
pcap_close((pcap_t *) handle);
43+
}
44+
45+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setSnaplen(jlong handle, jint snaplen) {
46+
return pcap_set_snaplen((pcap_t *) handle, snaplen);
47+
}
48+
49+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_snapshot(jlong handle) {
50+
return pcap_snapshot((pcap_t *) handle);
51+
}
52+
53+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setPromisc(jlong handle, jint promisc) {
54+
return pcap_set_promisc((pcap_t *) handle, promisc);
55+
}
56+
57+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setProtocolLinux(jlong handle, jint protocol) {
58+
return pcap_set_protocol_linux((pcap_t *) handle, protocol);
59+
}
60+
61+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setRfmon(jlong handle, jint rfmon) {
62+
return pcap_set_rfmon((pcap_t *) handle, rfmon);
63+
}
64+
65+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_canSetRfmon(jlong handle) {
66+
return pcap_can_set_rfmon((pcap_t *) handle);
67+
}
68+
69+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setTimeout(jlong handle, jint ms) {
70+
return pcap_set_timeout((pcap_t *) handle, ms);
71+
}
72+
73+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setImmediateMode(jlong handle, jint immediateMode) {
74+
return pcap_set_immediate_mode((pcap_t *) handle, immediateMode);
75+
}
76+
77+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setBufferSize(jlong handle, jint bufferSize) {
78+
return pcap_set_buffer_size((pcap_t *) handle, bufferSize);
79+
}
80+
81+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setTstampType(jlong handle, jint tstampType) {
82+
return pcap_set_tstamp_type((pcap_t *) handle, tstampType);
83+
}
84+
85+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_freeTstampTypes(jlong address) {
86+
pcap_free_tstamp_types((int *) address);
87+
}
88+
89+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setTstampPrecision(jlong handle, jint tstampPrecision) {
90+
return pcap_set_tstamp_precision((pcap_t *) handle, tstampPrecision);
91+
}
92+
93+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_getTstampPrecision(jlong handle) {
94+
return pcap_get_tstamp_precision((pcap_t *) handle);
95+
}
96+
97+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_datalink(jlong handle) {
98+
return pcap_datalink((pcap_t *) handle);
99+
}
100+
101+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_file(jlong handle) {
102+
FILE *file = pcap_file((pcap_t *) handle);
103+
if (file) {
104+
return fileno(file);
105+
} else {
106+
return 0;
107+
}
108+
}
109+
110+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_isSwapped(jlong handle) {
111+
return pcap_is_swapped((pcap_t *) handle);
112+
}
113+
114+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_majorVersion(jlong handle) {
115+
return pcap_major_version((pcap_t *) handle);
116+
}
117+
118+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_minorVersion(jlong handle) {
119+
return pcap_minor_version((pcap_t *) handle);
120+
}
121+
122+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_freeDatalinks(jlong datalinks) {
123+
pcap_free_datalinks((int *) datalinks);
124+
}
125+
126+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_breakLoop(jlong handle) {
127+
pcap_breakloop((pcap_t *) handle);
128+
}
129+
130+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_stats(jlong handle, jlong stats) {
131+
return pcap_stats((pcap_t *) handle, (struct pcap_stat *) stats);
132+
}
133+
134+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setFilter(jlong handle, jlong program) {
135+
return pcap_setfilter((pcap_t *) handle, (struct bpf_program *) program);
136+
}
137+
138+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setDirection(jlong handle, jint direction) {
139+
return pcap_setdirection((pcap_t *) handle, direction);
140+
}
141+
142+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_freeCode(jlong handle) {
143+
pcap_freecode((struct bpf_program *) handle);
144+
}
145+
146+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_setDatalink(jlong handle, jint datalink) {
147+
return pcap_set_datalink((pcap_t *) handle, datalink);
148+
}
149+
150+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_fileno(jlong handle) {
151+
return pcap_fileno((pcap_t *) handle);
152+
}
153+
154+
JNIEXPORT jlong JNICALL JavaCritical_net_elytrium_pcap_PcapNative_dumpFtell(jlong handle) {
155+
return pcap_dump_ftell((pcap_dumper_t *) handle);
156+
}
157+
158+
JNIEXPORT jint JNICALL JavaCritical_net_elytrium_pcap_PcapNative_dumpFlush(jlong handle) {
159+
return pcap_dump_flush((pcap_dumper_t *) handle);
160+
}
161+
162+
JNIEXPORT void JNICALL JavaCritical_net_elytrium_pcap_PcapNative_dumpClose(jlong handle) {
163+
pcap_dump_close((pcap_dumper_t *) handle);
164+
}

src/main/java/net/elytrium/pcap/Pcap.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131

3232
public class Pcap {
3333

34+
private static final boolean IS_JAVA_CRITICAL = PcapNative.isJavaCritical();
35+
36+
public static boolean isJavaCritical() {
37+
return IS_JAVA_CRITICAL;
38+
}
39+
3440
public static void init() throws PcapException {
3541
String error = PcapNative.init();
3642
if (error != null) {

src/main/java/net/elytrium/pcap/PcapNative.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class PcapNative {
4646
}
4747
}
4848

49+
public static native boolean isJavaCritical();
50+
4951
public static native String getErrorBuffer();
5052

5153
public static native String init();

0 commit comments

Comments
 (0)