Java Unix Domain Socket implementation providing AF_UNIX, AF_TIPC, AF_VSOCK, and AF_SYSTEM socket support with traditional and NIO APIs
—
Runtime capability detection and platform support validation for socket features and protocol availability across different operating systems and environments.
import org.newsclub.net.unix.AFSocketCapability;
import org.newsclub.net.unix.AFUNIXSocketCapability;
import org.newsclub.net.unix.AFSocketCapabilityRequirement;Base enumeration for testing socket type and protocol support on the current platform.
/**
* Enumeration of socket capabilities that can be tested
*/
public enum AFSocketCapability {
/** Peer credential support */
CAPABILITY_PEER_CREDENTIALS,
/** Ancillary message support */
CAPABILITY_ANCILLARY_MESSAGES,
/** File descriptor passing support */
CAPABILITY_FILE_DESCRIPTORS,
/** Linux abstract namespace support */
CAPABILITY_ABSTRACT_NAMESPACE,
/** Unix Domain Socket support */
CAPABILITY_UNIX_DOMAIN,
/** Unix datagram socket support */
CAPABILITY_UNIX_DATAGRAMS,
/** Native socket pair support */
CAPABILITY_NATIVE_SOCKETPAIR,
/** TIPC socket support (Linux) */
CAPABILITY_TIPC,
/** VSOCK socket support (VM communication) */
CAPABILITY_VSOCK,
/** AF_SYSTEM socket support (macOS) */
CAPABILITY_SYSTEM;
/**
* Tests if this capability is supported on the current platform
* @return true if capability is supported
*/
public boolean isSupported();
/**
* Gets a human-readable description of this capability
* @return capability description
*/
public String getDescription();
}Usage Examples:
import org.newsclub.net.unix.*;
// Test basic socket support
public class CapabilityTester {
public static void main(String[] args) {
System.out.println("Socket Capability Report:");
for (AFSocketCapability capability : AFSocketCapability.values()) {
boolean supported = capability.isSupported();
System.out.printf(" %-20s: %s - %s%n",
capability.name(),
supported ? "✓ SUPPORTED" : "✗ NOT SUPPORTED",
capability.getDescription());
}
// Make decisions based on capabilities
if (AFSocketCapability.CAPABILITY_UNIX_DOMAIN.isSupported()) {
System.out.println("\nUnix Domain Sockets are available - proceeding with UDS implementation");
initializeUnixSocketService();
} else {
System.out.println("\nUnix Domain Sockets not available - falling back to TCP");
initializeTcpService();
}
// Test advanced features
if (AFSocketCapability.CAPABILITY_PEER_CREDENTIALS.isSupported()) {
System.out.println("Peer credentials available - enabling authentication");
}
if (AFSocketCapability.CAPABILITY_FILE_DESCRIPTORS.isSupported()) {
System.out.println("File descriptor passing available - enabling advanced IPC");
}
if (AFSocketCapability.CAPABILITY_ABSTRACT_NAMESPACE.isSupported()) {
System.out.println("Abstract namespace available - Linux features enabled");
}
if (AFSocketCapability.CAPABILITY_TIPC.isSupported()) {
System.out.println("TIPC support available for cluster communication");
}
if (AFSocketCapability.CAPABILITY_VSOCK.isSupported()) {
System.out.println("VSOCK support available for VM communication");
}
}
private static void initializeUnixSocketService() {
// Unix socket service initialization
}
private static void initializeTcpService() {
// TCP fallback service initialization
}
}Unix Domain Socket-specific capabilities for platform-specific features and advanced functionality.
/**
* Unix Domain Socket specific capabilities
*/
public enum AFUNIXSocketCapability {
/** Peer credentials support (PID, UID, GID) */
CAPABILITY_PEER_CREDENTIALS,
/** File descriptor passing support */
CAPABILITY_FILE_DESCRIPTORS,
/** Abstract namespace support (Linux) */
CAPABILITY_ABSTRACT_NAMESPACE,
/** Ancillary message support */
CAPABILITY_ANCILLARY_MESSAGES,
/** Socket pair creation support */
CAPABILITY_SOCKET_PAIRS,
/** Large buffer support for high-throughput operations */
CAPABILITY_LARGE_BUFFERS,
/** Non-blocking I/O support */
CAPABILITY_NON_BLOCKING_IO,
/** Address reuse support */
CAPABILITY_ADDRESS_REUSE;
/**
* Tests if this Unix socket capability is supported
* @return true if capability is supported
*/
public boolean isSupported();
/**
* Gets the minimum version requirement for this capability
* @return version string or null if no specific requirement
*/
public String getMinimumVersion();
/**
* Gets platform-specific notes for this capability
* @return platform notes or empty string
*/
public String getPlatformNotes();
}Usage Examples:
// Platform-specific feature detection
public class UnixSocketFeatures {
public static void demonstrateCapabilities() {
System.out.println("Unix Domain Socket Feature Report:");
// Check peer credentials support
if (AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS.isSupported()) {
System.out.println("✓ Peer credentials available - can authenticate connections");
demonstratePeerCredentials();
} else {
System.out.println("✗ Peer credentials not available - using alternative auth");
}
// Check abstract namespace (Linux-specific)
if (AFUNIXSocketCapability.CAPABILITY_ABSTRACT_NAMESPACE.isSupported()) {
System.out.println("✓ Abstract namespace available - using abstract sockets");
demonstrateAbstractSockets();
} else {
System.out.println("✗ Abstract namespace not available - using filesystem sockets");
}
// Check file descriptor passing
if (AFUNIXSocketCapability.CAPABILITY_FILE_DESCRIPTORS.isSupported()) {
System.out.println("✓ File descriptor passing available");
demonstrateFileDescriptorPassing();
}
// Check large buffer support for high-performance scenarios
if (AFUNIXSocketCapability.CAPABILITY_LARGE_BUFFERS.isSupported()) {
System.out.println("✓ Large buffer support - optimizing for high throughput");
configureHighThroughput();
}
}
private static void demonstratePeerCredentials() {
try {
// Implementation would use peer credentials
System.out.println(" Peer credential authentication enabled");
} catch (Exception e) {
System.err.println(" Failed to configure peer credentials: " + e.getMessage());
}
}
private static void demonstrateAbstractSockets() {
try {
AFUNIXSocketAddress abstractAddr = AFUNIXSocketAddress.inAbstractNamespace("test-service");
System.out.println(" Using abstract socket: " + abstractAddr.getPathname());
} catch (Exception e) {
System.err.println(" Failed to create abstract socket: " + e.getMessage());
}
}
private static void demonstrateFileDescriptorPassing() {
System.out.println(" File descriptor passing configured");
// Implementation would set up FD passing
}
private static void configureHighThroughput() {
System.out.println(" Configuring large buffers for high throughput");
// Implementation would configure buffer sizes
}
}Capability requirement specification for validating platform support before socket operations.
/**
* Defines capability requirements for socket operations
*/
public class AFSocketCapabilityRequirement {
/**
* Creates a requirement for a single capability
* @param capability The required capability
* @return AFSocketCapabilityRequirement instance
*/
public static AFSocketCapabilityRequirement require(AFSocketCapability capability);
/**
* Creates a requirement for a Unix-specific capability
* @param capability The required Unix capability
* @return AFSocketCapabilityRequirement instance
*/
public static AFSocketCapabilityRequirement require(AFUNIXSocketCapability capability);
/**
* Creates a requirement for multiple capabilities (all must be supported)
* @param capabilities Required capabilities
* @return AFSocketCapabilityRequirement instance
*/
public static AFSocketCapabilityRequirement requireAll(AFSocketCapability... capabilities);
/**
* Creates a requirement where at least one capability must be supported
* @param capabilities Alternative capabilities
* @return AFSocketCapabilityRequirement instance
*/
public static AFSocketCapabilityRequirement requireAny(AFSocketCapability... capabilities);
/**
* Tests if the requirements are satisfied on current platform
* @return true if all requirements are met
*/
public boolean isSatisfied();
/**
* Gets detailed information about unsatisfied requirements
* @return list of unsatisfied requirements
*/
public List<String> getUnsatisfiedRequirements();
/**
* Throws exception if requirements are not satisfied
* @throws OperationNotSupportedSocketException if requirements not met
*/
public void validateOrThrow() throws OperationNotSupportedSocketException;
}Usage Examples:
// Requirement validation for robust applications
public class RequirementBasedSocketService {
public void initializeService() throws OperationNotSupportedSocketException {
// Define service requirements
AFSocketCapabilityRequirement requirements = AFSocketCapabilityRequirement.requireAll(
AFSocketCapability.CAPABILITY_UNIX_DOMAIN,
AFSocketCapability.CAPABILITY_SERVER_SOCKETS,
AFSocketCapability.CAPABILITY_NIO_CHANNELS
);
// Validate requirements before proceeding
if (!requirements.isSatisfied()) {
List<String> unsatisfied = requirements.getUnsatisfiedRequirements();
System.err.println("Service requirements not met:");
for (String requirement : unsatisfied) {
System.err.println(" - " + requirement);
}
throw new OperationNotSupportedSocketException("Platform does not meet service requirements");
}
System.out.println("All requirements satisfied - initializing service");
startSocketService();
}
public void initializeAuthenticationService() {
// Authentication service with peer credentials or alternative
AFSocketCapabilityRequirement authRequirement = AFSocketCapabilityRequirement.requireAny(
AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS,
AFUNIXSocketCapability.CAPABILITY_FILE_DESCRIPTORS
);
if (authRequirement.isSatisfied()) {
if (AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS.isSupported()) {
initializePeerCredentialAuth();
} else {
initializeFileDescriptorAuth();
}
} else {
initializeTokenBasedAuth();
}
}
public void validateCapabilitiesWithFeedback() {
// Comprehensive capability validation with user feedback
System.out.println("Validating platform capabilities...");
try {
AFSocketCapabilityRequirement.require(AFSocketCapability.CAPABILITY_UNIX_DOMAIN)
.validateOrThrow();
System.out.println("✓ Unix Domain Sockets supported");
} catch (OperationNotSupportedSocketException e) {
System.err.println("✗ Unix Domain Sockets not supported: " + e.getMessage());
return;
}
// Check optional features
AFSocketCapabilityRequirement optionalFeatures = AFSocketCapabilityRequirement.requireAny(
AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS,
AFUNIXSocketCapability.CAPABILITY_ABSTRACT_NAMESPACE,
AFUNIXSocketCapability.CAPABILITY_FILE_DESCRIPTORS
);
if (optionalFeatures.isSatisfied()) {
System.out.println("✓ Advanced Unix socket features available");
} else {
System.out.println("! No advanced features available - using basic functionality");
}
}
private void startSocketService() {
System.out.println("Socket service started");
}
private void initializePeerCredentialAuth() {
System.out.println("Initializing peer credential authentication");
}
private void initializeFileDescriptorAuth() {
System.out.println("Initializing file descriptor authentication");
}
private void initializeTokenBasedAuth() {
System.out.println("Initializing token-based authentication");
}
}// Comprehensive platform capability detection
public class PlatformCapabilities {
public static class CapabilityReport {
private final Map<AFSocketCapability, Boolean> socketCapabilities;
private final Map<AFUNIXSocketCapability, Boolean> unixCapabilities;
private final String platformInfo;
public CapabilityReport() {
this.socketCapabilities = detectSocketCapabilities();
this.unixCapabilities = detectUnixCapabilities();
this.platformInfo = detectPlatformInfo();
}
public boolean hasCapability(AFSocketCapability capability) {
return socketCapabilities.getOrDefault(capability, false);
}
public boolean hasCapability(AFUNIXSocketCapability capability) {
return unixCapabilities.getOrDefault(capability, false);
}
public String getPlatformInfo() {
return platformInfo;
}
public void printReport() {
System.out.println("Platform Capability Report");
System.out.println("==========================");
System.out.println("Platform: " + platformInfo);
System.out.println();
System.out.println("Socket Capabilities:");
for (Map.Entry<AFSocketCapability, Boolean> entry : socketCapabilities.entrySet()) {
System.out.printf(" %-25s: %s%n",
entry.getKey().name(),
entry.getValue() ? "✓" : "✗");
}
System.out.println();
System.out.println("Unix Socket Capabilities:");
for (Map.Entry<AFUNIXSocketCapability, Boolean> entry : unixCapabilities.entrySet()) {
System.out.printf(" %-30s: %s%n",
entry.getKey().name(),
entry.getValue() ? "✓" : "✗");
if (entry.getValue()) {
String notes = entry.getKey().getPlatformNotes();
if (!notes.isEmpty()) {
System.out.println(" " + notes);
}
}
}
}
private Map<AFSocketCapability, Boolean> detectSocketCapabilities() {
Map<AFSocketCapability, Boolean> capabilities = new HashMap<>();
for (AFSocketCapability capability : AFSocketCapability.values()) {
capabilities.put(capability, capability.isSupported());
}
return capabilities;
}
private Map<AFUNIXSocketCapability, Boolean> detectUnixCapabilities() {
Map<AFUNIXSocketCapability, Boolean> capabilities = new HashMap<>();
for (AFUNIXSocketCapability capability : AFUNIXSocketCapability.values()) {
capabilities.put(capability, capability.isSupported());
}
return capabilities;
}
private String detectPlatformInfo() {
return System.getProperty("os.name") + " " +
System.getProperty("os.version") + " " +
System.getProperty("os.arch");
}
}
public static void main(String[] args) {
CapabilityReport report = new CapabilityReport();
report.printReport();
// Example usage based on capabilities
if (report.hasCapability(AFSocketCapability.CAPABILITY_UNIX_DOMAIN)) {
System.out.println("\nUnix Domain Sockets available - configuring UDS service");
if (report.hasCapability(AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS)) {
System.out.println("Enabling peer credential authentication");
}
if (report.hasCapability(AFUNIXSocketCapability.CAPABILITY_ABSTRACT_NAMESPACE)) {
System.out.println("Using abstract namespace for temporary sockets");
}
}
}
}// Application configuration that adapts to platform capabilities
public class AdaptiveSocketConfiguration {
private final CapabilityReport capabilities;
public AdaptiveSocketConfiguration() {
this.capabilities = new PlatformCapabilities.CapabilityReport();
}
public SocketConfiguration getOptimalConfiguration() {
SocketConfiguration config = new SocketConfiguration();
// Base configuration
if (capabilities.hasCapability(AFSocketCapability.CAPABILITY_UNIX_DOMAIN)) {
config.setSocketType(SocketType.UNIX_DOMAIN);
} else {
config.setSocketType(SocketType.TCP_FALLBACK);
}
// Authentication configuration
if (capabilities.hasCapability(AFUNIXSocketCapability.CAPABILITY_PEER_CREDENTIALS)) {
config.setAuthenticationMethod(AuthMethod.PEER_CREDENTIALS);
} else if (capabilities.hasCapability(AFUNIXSocketCapability.CAPABILITY_FILE_DESCRIPTORS)) {
config.setAuthenticationMethod(AuthMethod.FILE_DESCRIPTOR);
} else {
config.setAuthenticationMethod(AuthMethod.TOKEN_BASED);
}
// Address configuration
if (capabilities.hasCapability(AFUNIXSocketCapability.CAPABILITY_ABSTRACT_NAMESPACE)) {
config.setAddressType(AddressType.ABSTRACT);
} else {
config.setAddressType(AddressType.FILESYSTEM);
}
// Performance configuration
if (capabilities.hasCapability(AFUNIXSocketCapability.CAPABILITY_LARGE_BUFFERS)) {
config.setBufferSize(65536); // 64KB buffers
} else {
config.setBufferSize(8192); // 8KB buffers
}
return config;
}
public static class SocketConfiguration {
private SocketType socketType;
private AuthMethod authenticationMethod;
private AddressType addressType;
private int bufferSize;
// Getters and setters
public SocketType getSocketType() { return socketType; }
public void setSocketType(SocketType socketType) { this.socketType = socketType; }
public AuthMethod getAuthenticationMethod() { return authenticationMethod; }
public void setAuthenticationMethod(AuthMethod authenticationMethod) { this.authenticationMethod = authenticationMethod; }
public AddressType getAddressType() { return addressType; }
public void setAddressType(AddressType addressType) { this.addressType = addressType; }
public int getBufferSize() { return bufferSize; }
public void setBufferSize(int bufferSize) { this.bufferSize = bufferSize; }
@Override
public String toString() {
return String.format("SocketConfiguration{socketType=%s, auth=%s, address=%s, buffer=%d}",
socketType, authenticationMethod, addressType, bufferSize);
}
}
public enum SocketType { UNIX_DOMAIN, TCP_FALLBACK }
public enum AuthMethod { PEER_CREDENTIALS, FILE_DESCRIPTOR, TOKEN_BASED }
public enum AddressType { ABSTRACT, FILESYSTEM }
}Install with Tessl CLI
npx tessl i tessl/maven-com-kohlschutter-junixsocket--junixsocket-core