package com.netifera.platform.internal.system; import org.osgi.service.component.ComponentContext; import com.netifera.platform.api.log.ILogManager; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.api.system.ISystemService; public class SystemService implements ISystemService { private final Bytesex bytesex = new Bytesex(); private final ISystemNative sysNative = new SystemNative(); private final Backdoor backdoor = new Backdoor(); private ILogger logger; private String backdoorPath; private final ThreadLocal<Integer> errno = new ThreadLocal<Integer>() { public Integer initialValue() { return 0; } }; public int backdoor_request(int request) { if(backdoorPath == null) { return -1; } return sysNative.native_backdoor(backdoorPath, request); } public String backdoor_path() { return backdoorPath; } public int syscall_close(int fd) { return syscall(sysNative.native_close(fd)); } public int syscall_ioctl(int fd, int request, byte[] data, int inlen, int outlen) { return syscall(sysNative.native_ioctl(fd, request, data, inlen, outlen)); } public int syscall_open(String path, int flags) { return syscall(sysNative.native_open(path, flags)); } public int syscall_read(int fd, byte[] buffer, int offset, int length) { return syscall(sysNative.native_read(fd, buffer, offset, length)); } public int syscall_write(int fd, byte[] buffer, int offset, int length) { return syscall(sysNative.native_write(fd, buffer, offset, length)); } public int getErrno() { return errno.get(); } public String getErrorMessage(int errno) { return sysNative.getErrorMessage(errno); } public void pack16(byte[] data, int offset, int value) { bytesex.pack16(data, offset, value); } public void pack32(byte[] data, int offset, int value) { bytesex.pack32(data, offset, value); } public int unpack16(byte[] data, int offset) { return bytesex.unpack16(data, offset); } public int unpack32(byte[] data, int offset) { return bytesex.unpack32(data, offset); } public int ntohs(int n) { return bytesex.ntohs(n); } public int ntohl(int n) { return bytesex.ntohl(n); } public int htons(int n) { return bytesex.htons(n); } public int htonl(int n) { return bytesex.htonl(n); } public SystemOS getOS() { return sysNative.getOS(); } public SystemArch getArch() { return sysNative.getArch(); } public int system_putbuffer(byte[] data, int length, byte[] address) { return syscall(sysNative.native_putbuffer(data, length, address)); } public int system_getbuffer(byte[] data, int length) { return syscall(sysNative.native_getbuffer(data, length)); } public int syscall_bind(int fd, byte[] addr, int addrlen) { return syscall(sysNative.native_bind(fd, addr, addrlen)); } public int syscall_getsockopt(int fd, int level, int optname, byte[] optdata, int optlen) { return syscall(sysNative.native_getsockopt(fd, level, optname, optdata, optlen)); } public int syscall_setsockopt(int fd, int level, int optname, byte[] optdata, int optlen) { return syscall(sysNative.native_setsockopt(fd, level, optname, optdata, optlen)); } public int syscall_socket(int domain, int type, int protocol) { return syscall(sysNative.native_socket(domain, type, protocol)); } public int syscall_recvfrom(int fd, byte[] buffer, int offset, int length, int flags, byte[] addr, int addrlen) { return syscall(sysNative.native_recvfrom(fd, buffer, offset, length, flags, addr, addrlen)); } public int syscall_poll(byte[] fds, int timeout) { return syscall(sysNative.native_poll(fds, timeout)); } public int system_forkexec(String path, String argv[], String env[], int fd, int master) { return syscall(sysNative.native_forkexec(path, argv, env, fd, master)); } private int syscall(int ret) { if(ret < 0) { errno.set(-ret); return -1; } else { return ret; } } protected void activate(ComponentContext context) { backdoorPath = backdoor.findBackdoorPath(getOS()); } protected void deactivate(ComponentContext context) { } protected void setLogManager(ILogManager logManager) { this.logger = logManager.getLogger("System Service"); backdoor.setLogger(logger); } protected void unsetLogManager(ILogManager logManager) { } }