trying to implement some sd_journal in JNA, without success
This commit is contained in:
parent
7c7303ed96
commit
c39a8630bc
6 changed files with 30 additions and 27 deletions
|
@ -2,6 +2,8 @@ package org.xbib.log4j.systemd;
|
||||||
|
|
||||||
import com.sun.jna.Native;
|
import com.sun.jna.Native;
|
||||||
|
|
||||||
|
import java.security.AccessController;
|
||||||
|
import java.security.PrivilegedAction;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +35,7 @@ public class SystemdLibraryAPI {
|
||||||
|
|
||||||
private static SystemdLibrary loadLibrary() {
|
private static SystemdLibrary loadLibrary() {
|
||||||
try {
|
try {
|
||||||
return Native.load("systemd", SystemdLibrary.class);
|
return (SystemdLibrary) AccessController.doPrivileged((PrivilegedAction<Object>) () -> Native.load("systemd", SystemdLibrary.class));
|
||||||
} catch (UnsatisfiedLinkError e) {
|
} catch (UnsatisfiedLinkError e) {
|
||||||
throw new RuntimeException("Failed to load systemd library." +
|
throw new RuntimeException("Failed to load systemd library." +
|
||||||
" Please note that JNA requires an executable temporary folder." +
|
" Please note that JNA requires an executable temporary folder." +
|
||||||
|
|
|
@ -19,6 +19,6 @@ class SystemdJournalReaderTest {
|
||||||
entry -> logger.log(Level.INFO, entry.toString()));
|
entry -> logger.log(Level.INFO, entry.toString()));
|
||||||
Executors.newSingleThreadExecutor().submit(consumer);
|
Executors.newSingleThreadExecutor().submit(consumer);
|
||||||
// consuming for some seconds
|
// consuming for some seconds
|
||||||
Thread.sleep(10000L);
|
Thread.sleep(60000L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
package org.xbib.systemd.journal;
|
|
||||||
|
|
||||||
import com.sun.jna.Structure;
|
|
||||||
|
|
||||||
public class SdJournal extends Structure {
|
|
||||||
public int toplevel_fd;
|
|
||||||
}
|
|
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import static org.xbib.systemd.journal.SystemdLibraryAPI.SD_JOURNAL_LOCAL_ONLY;
|
import static org.xbib.systemd.journal.SystemdLibraryInstance.SD_JOURNAL_LOCAL_ONLY;
|
||||||
|
|
||||||
public class SystemdJournalConsumer implements Runnable {
|
public class SystemdJournalConsumer implements Runnable {
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@ public class SystemdJournalConsumer implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loop() throws IOException {
|
private void loop() throws IOException {
|
||||||
SystemdLibraryAPI api = SystemdLibraryAPI.getInstance();
|
SystemdLibraryInstance api = SystemdLibraryInstance.getInstance();
|
||||||
SdJournal sdJournal = new SdJournal();
|
SystemdLibrary.SdJournal sdJournal = new SystemdLibrary.SdJournal();
|
||||||
logger.log(Level.INFO, "opening");
|
logger.log(Level.INFO, "opening");
|
||||||
int rc = api.sd_journal_open(sdJournal, SD_JOURNAL_LOCAL_ONLY);
|
int rc = api.sd_journal_open(sdJournal, SD_JOURNAL_LOCAL_ONLY);
|
||||||
logger.log(Level.INFO, "open: " + rc);
|
logger.log(Level.INFO, "open: " + rc);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.xbib.systemd.journal;
|
||||||
import com.sun.jna.Library;
|
import com.sun.jna.Library;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
import com.sun.jna.StringArray;
|
import com.sun.jna.StringArray;
|
||||||
|
import com.sun.jna.Structure;
|
||||||
|
|
||||||
public interface SystemdLibrary extends Library {
|
public interface SystemdLibrary extends Library {
|
||||||
|
|
||||||
|
@ -29,4 +30,11 @@ public interface SystemdLibrary extends Library {
|
||||||
int sd_journal_enumerate_data(SdJournal sdJournal, Pointer data, Pointer length);
|
int sd_journal_enumerate_data(SdJournal sdJournal, Pointer data, Pointer length);
|
||||||
|
|
||||||
int sd_journal_restart_data(SdJournal sdJournal);
|
int sd_journal_restart_data(SdJournal sdJournal);
|
||||||
|
|
||||||
|
class SdJournal extends Structure {
|
||||||
|
public int top_level_fd;
|
||||||
|
public String path;
|
||||||
|
public String prefix;
|
||||||
|
public String namespace;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,17 +11,17 @@ import java.util.List;
|
||||||
*
|
*
|
||||||
* The native library is loaded only once, so this class is a singleton.
|
* The native library is loaded only once, so this class is a singleton.
|
||||||
*/
|
*/
|
||||||
public class SystemdLibraryAPI {
|
public class SystemdLibraryInstance {
|
||||||
|
|
||||||
private static final SystemdLibraryAPI instance = new SystemdLibraryAPI();
|
private static final SystemdLibraryInstance instance = new SystemdLibraryInstance();
|
||||||
|
|
||||||
private final SystemdLibrary systemdLibrary;
|
private final SystemdLibrary systemdLibrary;
|
||||||
|
|
||||||
private SystemdLibraryAPI() {
|
private SystemdLibraryInstance() {
|
||||||
this.systemdLibrary = loadLibrary();
|
this.systemdLibrary = loadLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SystemdLibraryAPI getInstance() {
|
public static SystemdLibraryInstance getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,47 +49,47 @@ public class SystemdLibraryAPI {
|
||||||
return systemdLibrary.sd_journal_send(format, args.toArray());
|
return systemdLibrary.sd_journal_send(format, args.toArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_open(SdJournal sdJournal, int flag) {
|
public int sd_journal_open(SystemdLibrary.SdJournal sdJournal, int flag) {
|
||||||
return systemdLibrary.sd_journal_open(sdJournal, flag);
|
return systemdLibrary.sd_journal_open(sdJournal, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_get_fd(SdJournal sdJournal) {
|
public int sd_journal_get_fd(SystemdLibrary.SdJournal sdJournal) {
|
||||||
return systemdLibrary.sd_journal_get_fd(sdJournal);
|
return systemdLibrary.sd_journal_get_fd(sdJournal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_seek_tail(SdJournal sdJournal) {
|
public int sd_journal_seek_tail(SystemdLibrary.SdJournal sdJournal) {
|
||||||
return systemdLibrary.sd_journal_seek_tail(sdJournal);
|
return systemdLibrary.sd_journal_seek_tail(sdJournal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_previous(SdJournal sdJournal) {
|
public int sd_journal_previous(SystemdLibrary.SdJournal sdJournal) {
|
||||||
return systemdLibrary.sd_journal_previous(sdJournal);
|
return systemdLibrary.sd_journal_previous(sdJournal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_next(SdJournal sdJournal) {
|
public int sd_journal_next(SystemdLibrary.SdJournal sdJournal) {
|
||||||
return systemdLibrary.sd_journal_next(sdJournal);
|
return systemdLibrary.sd_journal_next(sdJournal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_get_cursor(SdJournal sdJournal, StringArray cursor) {
|
public int sd_journal_get_cursor(SystemdLibrary.SdJournal sdJournal, StringArray cursor) {
|
||||||
return systemdLibrary.sd_journal_get_cursor(sdJournal, cursor);
|
return systemdLibrary.sd_journal_get_cursor(sdJournal, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_add_match(SdJournal sdJournal, String match, int len) {
|
public int sd_journal_add_match(SystemdLibrary.SdJournal sdJournal, String match, int len) {
|
||||||
return systemdLibrary.sd_journal_add_match(sdJournal, match, len);
|
return systemdLibrary.sd_journal_add_match(sdJournal, match, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_wait(SdJournal sdJournal, long timeout_musec) {
|
public int sd_journal_wait(SystemdLibrary.SdJournal sdJournal, long timeout_musec) {
|
||||||
return systemdLibrary.sd_journal_wait(sdJournal, timeout_musec);
|
return systemdLibrary.sd_journal_wait(sdJournal, timeout_musec);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_get_data(SdJournal sdJournal, String field, Pointer data, Pointer length) {
|
public int sd_journal_get_data(SystemdLibrary.SdJournal sdJournal, String field, Pointer data, Pointer length) {
|
||||||
return systemdLibrary.sd_journal_get_data(sdJournal, field, data, length);
|
return systemdLibrary.sd_journal_get_data(sdJournal, field, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_enumerate_data(SdJournal sdJournal, Pointer data, Pointer length) {
|
public int sd_journal_enumerate_data(SystemdLibrary.SdJournal sdJournal, Pointer data, Pointer length) {
|
||||||
return systemdLibrary.sd_journal_enumerate_data(sdJournal, data, length);
|
return systemdLibrary.sd_journal_enumerate_data(sdJournal, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sd_journal_restart_data(SdJournal sdJournal) {
|
public int sd_journal_restart_data(SystemdLibrary.SdJournal sdJournal) {
|
||||||
return systemdLibrary.sd_journal_restart_data(sdJournal);
|
return systemdLibrary.sd_journal_restart_data(sdJournal);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue