diff options
Diffstat (limited to 'org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java')
-rw-r--r-- | org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java b/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java new file mode 100644 index 0000000000..54e4e2a5a8 --- /dev/null +++ b/org.eclipse.jgit.ssh.apache.agent/src/org/eclipse/jgit/internal/transport/sshd/agent/connector/UnixSockets.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2021, Thomas Wolf <thomas.wolf@paranor.ch> and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.internal.transport.sshd.agent.connector; + +import com.sun.jna.LastErrorException; +import com.sun.jna.Library; +import com.sun.jna.Structure; +import com.sun.jna.platform.unix.LibCAPI; + +/** + * Low-level Unix/Linux JNA socket API. + */ +interface UnixSockets extends LibCAPI, Library { + + /** + * Library to load. These functions live in libc. + */ + String LIBRARY_NAME = "c"; //$NON-NLS-1$ + + /** + * Command to set the close-on-exec flag on a file descriptor via + * {@link #fcntl(int, int, int)}. + */ + int F_SETFD = 2; + + /** + * Specifies that a file descriptor shall not be inherited by child + * processes. + */ + int FD_CLOEXEC = 1; + + /** + * Creates a socket and returns a file descriptor for it. + * + * @param domain + * socket domain; use {@link Sockets#AF_UNIX} + * @param type + * socket type; use {@link Sockets#SOCK_STREAM} + * @param protocol + * socket communication protocol; use + * {@link Sockets#DEFAULT_PROTOCOL}. + * @return file descriptor for the socket; should be closed eventually, or + * -1 on error. + * @throws LastErrorException + * on errors + * @see LibCAPI#close(int) + */ + int socket(int domain, int type, int protocol) throws LastErrorException; + + /** + * Simple binding to fcntl; used to set the FD_CLOEXEC flag. On OS X, we + * cannot include SOCK_CLOEXEC in the socket() call. + * + * @param fd + * file descriptor to operate on + * @param command + * set to {@link #F_SETFD} + * @param flag + * zero to clear the close-on-exec flag, {@link #FD_CLOEXEC} to + * set it + * @return -1 on error, otherwise a value >= 0 + * @throws LastErrorException + * represents non-zero error code for the last error + */ + int fcntl(int fd, int command, int flag) throws LastErrorException; + + /** + * Connects a file descriptor, which must refer to a socket, to a + * {@link Sockets.SockAddr}. + * + * @param fd + * file descriptor of the socket, as returned by + * {@link #socket(int, int, int)} + * @param addr + * address to connect to + * @param addrLen + * Length of {@code addr}, use {@link Structure#size()} + * @return 0 on success; -1 otherwise + * @throws LastErrorException + * on errors + */ + int connect(int fd, Sockets.SockAddr addr, int addrLen) + throws LastErrorException; + + /** + * Read data from a file descriptor. + * + * @param fd + * file descriptor to read from + * @param buf + * buffer to read into + * @param bufLen + * maximum number of bytes to read; at most length of {@code buf} + * @return number of bytes actually read; zero for EOF, -1 on error + * @throws LastErrorException + * on errors + */ + LibCAPI.ssize_t read(int fd, byte[] buf, LibCAPI.size_t bufLen) + throws LastErrorException; + + /** + * Write data to a file descriptor. + * + * @param fd + * file descriptor to write to + * @param data + * data to write + * @param dataLen + * number of bytes to write + * @return number of bytes actually written; -1 on error + * @throws LastErrorException + * on errors + */ + LibCAPI.ssize_t write(int fd, byte[] data, LibCAPI.size_t dataLen) + throws LastErrorException; +} |