CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-kohlschutter-junixsocket--junixsocket-core

Java Unix Domain Socket implementation providing AF_UNIX, AF_TIPC, AF_VSOCK, and AF_SYSTEM socket support with traditional and NIO APIs

Pending
Overview
Eval results
Files

capabilities.mddocs/

Socket Capabilities

Runtime capability detection and platform support validation for socket features and protocol availability across different operating systems and environments.

Core Imports

import org.newsclub.net.unix.AFSocketCapability;
import org.newsclub.net.unix.AFUNIXSocketCapability;
import org.newsclub.net.unix.AFSocketCapabilityRequirement;

Capabilities

AFSocketCapability

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
    }
}

AFUNIXSocketCapability

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
    }
}

AFSocketCapabilityRequirement

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");
    }
}

Capability Detection Patterns

Runtime Platform Detection

// 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 Based on Capabilities

// 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

docs

addressing.md

capabilities.md

datagram-sockets.md

exceptions.md

file-descriptors.md

index.md

nio-channels.md

rmi.md

socket-pairs.md

unix-sockets.md

utilities.md

tile.json