Skip to content

Commit

Permalink
Add mappings for size_t, ssize_t, shared memory and libc file functions
Browse files Browse the repository at this point in the history
  • Loading branch information
dbwiddis authored and matthiasblaesing committed Jun 18, 2020
1 parent 43c4e67 commit d471b15
Show file tree
Hide file tree
Showing 9 changed files with 796 additions and 22 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Features
* [#1194](https://github.com/java-native-access/jna/pull/1194): Add `GetConsoleScreenBufferInfo`, `ReadConsoleInput` and `WriteConsole` with associated structures to `c.s.j.p.win32.Wincon` - [@rednoah](https://github.com/rednoah).
* [#1198](https://github.com/java-native-access/jna/pull/1198): Add `NetSessionEnum` to `c.s.j.p.win32.Netapi32` and `WTSEnumerateSessions`, `WTSQuerySessionInformation`, and `WTSFreeMemory` to `c.s.j.p.win32.Wtsapi32` - [@dbwiddis](https://github.com/dbwiddis).
* [#1200](https://github.com/java-native-access/jna/pull/1200): Add mappings for `libudev` to `c.s.j.p.linux.Udev` - [@dbwiddis](https://github.com/dbwiddis).
* [#1202](https://github.com/java-native-access/jna/pull/1202): Add mappings supporting shared memory including `c.s.j.p.unix.LibCAPI` types `size_t` and `ssize_t`, `c.s.j.p.linux.LibC` methods `munmap()`, `msync()`, and `close()`, `c.s.j.p.unix.LibCUtil` mapping `mmap()` and `ftruncate()`, and `c.s.j.p.linux.LibRT` methods `shm_open()` and `shm_unlink()` - [@dbwiddis](https://github.com/dbwiddis).
* [#1209](https://github.com/java-native-access/jna/pull/1209): Add mappings for `Thread32First` and `Thread32Next` to `c.s.j.p.win32.Kernel32` - [@dbwiddis](https://github.com/dbwiddis).

Bug Fixes
Expand Down
162 changes: 162 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/linux/ErrNo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/* Copyright (c) 2020 Daniel Widdis, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna.platform.linux;

import com.sun.jna.Native;

/**
* System error codes set in {@code errno} and retrieved by
* {@link Native#getLastError()}
*/
public interface ErrNo {
int EPERM = 1; // Operation not permitted
int ENOENT = 2; // No such file or directory
int ESRCH = 3; // No such process
int EINTR = 4; // Interrupted system call
int EIO = 5; // I/O error
int ENXIO = 6; // No such device or address
int E2BIG = 7; // Argument list too long
int ENOEXEC = 8; // Exec format error
int EBADF = 9; // Bad file number
int ECHILD = 10; // No child processes
int EAGAIN = 11; // Try again
int ENOMEM = 12; // Out of memory
int EACCES = 13; // Permission denied
int EFAULT = 14; // Bad address
int ENOTBLK = 15; // Block device required
int EBUSY = 16; // Device or resource busy
int EEXIST = 17; // File exists
int EXDEV = 18; // Cross-device link
int ENODEV = 19; // No such device
int ENOTDIR = 20; // Not a directory
int EISDIR = 21; // Is a directory
int EINVAL = 22; // Invalid argument
int ENFILE = 23; // File table overflow
int EMFILE = 24; // Too many open files
int ENOTTY = 25; // Not a typewriter
int ETXTBSY = 26; // Text file busy
int EFBIG = 27; // File too large
int ENOSPC = 28; // No space left on device
int ESPIPE = 29; // Illegal seek
int EROFS = 30; // Read-only file system
int EMLINK = 31; // Too many links
int EPIPE = 32; // Broken pipe
int EDOM = 33; // Math argument out of domain of func
int ERANGE = 34; // Math result not representable
int EDEADLK = 35; // Resource deadlock would occur
int ENAMETOOLONG = 36; // File name too long
int ENOLCK = 37; // No record locks available
int ENOSYS = 38; // Function not implemented
int ENOTEMPTY = 39; // Directory not empty
int ELOOP = 40; // Too many symbolic links encountered
int ENOMSG = 42; // No message of desired type
int EIDRM = 43; // Identifier removed
int ECHRNG = 44; // Channel number out of range
int EL2NSYNC = 45; // Level 2 not synchronized
int EL3HLT = 46; // Level 3 halted
int EL3RST = 47; // Level 3 reset
int ELNRNG = 48; // Link number out of range
int EUNATCH = 49; // Protocol driver not attached
int ENOCSI = 50; // No CSI structure available
int EL2HLT = 51; // Level 2 halted
int EBADE = 52; // Invalid exchange
int EBADR = 53; // Invalid request descriptor
int EXFULL = 54; // Exchange full
int ENOANO = 55; // No anode
int EBADRQC = 56; // Invalid request code
int EBADSLT = 57; // Invalid slot
int EBFONT = 59; // Bad font file format
int ENOSTR = 60; // Device not a stream
int ENODATA = 61; // No data available
int ETIME = 62; // Timer expired
int ENOSR = 63; // Out of streams resources
int ENONET = 64; // Machine is not on the network
int ENOPKG = 65; // Package not installed
int EREMOTE = 66; // Object is remote
int ENOLINK = 67; // Link has been severed
int EADV = 68; // Advertise error
int ESRMNT = 69; // Srmount error
int ECOMM = 70; // Communication error on send
int EPROTO = 71; // Protocol error
int EMULTIHOP = 72; // Multihop attempted
int EDOTDOT = 73; // RFS specific error
int EBADMSG = 74; // Not a data message
int EOVERFLOW = 75; // Value too large for defined data type
int ENOTUNIQ = 76; // Name not unique on network
int EBADFD = 77; // File descriptor in bad state
int EREMCHG = 78; // Remote address changed
int ELIBACC = 79; // Can not access a needed shared library
int ELIBBAD = 80; // Accessing a corrupted shared library
int ELIBSCN = 81; // .lib section in a.out corrupted
int ELIBMAX = 82; // Attempting to link in too many shared libraries
int ELIBEXEC = 83; // Cannot exec a shared library directly
int EILSEQ = 84; // Illegal byte sequence
int ERESTART = 85; // Interrupted system call should be restarted
int ESTRPIPE = 86; // Streams pipe error
int EUSERS = 87; // Too many users
int ENOTSOCK = 88; // Socket operation on non-socket
int EDESTADDRREQ = 89; // Destination address required
int EMSGSIZE = 90; // Message too long
int EPROTOTYPE = 91; // Protocol wrong type for socket
int ENOPROTOOPT = 92; // Protocol not available
int EPROTONOSUPPORT = 93; // Protocol not supported
int ESOCKTNOSUPPORT = 94; // Socket type not supported
int EOPNOTSUPP = 95; // Operation not supported on transport endpoint
int EPFNOSUPPORT = 96; // Protocol family not supported
int EAFNOSUPPORT = 97; // Address family not supported by protocol
int EADDRINUSE = 98; // Address already in use
int EADDRNOTAVAIL = 99; // Cannot assign requested address
int ENETDOWN = 100; // Network is down
int ENETUNREACH = 101; // Network is unreachable
int ENETRESET = 102; // Network dropped connection because of reset
int ECONNABORTED = 103; // Software caused connection abort
int ECONNRESET = 104; // Connection reset by peer
int ENOBUFS = 105; // No buffer space available
int EISCONN = 106; // Transport endpoint is already connected
int ENOTCONN = 107; // Transport endpoint is not connected
int ESHUTDOWN = 108; // Cannot send after transport endpoint shutdown
int ETOOMANYREFS = 109; // Too many references: cannot splice
int ETIMEDOUT = 110; // Connection timed out
int ECONNREFUSED = 111; // Connection refused
int EHOSTDOWN = 112; // Host is down
int EHOSTUNREACH = 113; // No route to host
int EALREADY = 114; // Operation already in progress
int EINPROGRESS = 115; // Operation now in progress
int ESTALE = 116; // Stale NFS file handle
int EUCLEAN = 117; // Structure needs cleaning
int ENOTNAM = 118; // Not a XENIX named type file
int ENAVAIL = 119; // No XENIX semaphores available
int EISNAM = 120; // Is a named type file
int EREMOTEIO = 121; // Remote I/O error
int EDQUOT = 122; // Quota exceeded
int ENOMEDIUM = 123; // No medium found
int EMEDIUMTYPE = 124; // Wrong medium type
int ECANCELED = 125; // Operation Canceled
int ENOKEY = 126; // Required key not available
int EKEYEXPIRED = 127; // Key has expired
int EKEYREVOKED = 128; // Key has been revoked
int EKEYREJECTED = 129; // Key was rejected by service
int EOWNERDEAD = 130; // Owner died
int ENOTRECOVERABLE = 131; // State not recoverable
}
64 changes: 64 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/linux/Fcntl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/* Copyright (c) 2020 Daniel Widdis, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna.platform.linux;

/**
* POSIX Standard: 6.5 File Control Operations from {@code fcntl.h}
*/
public interface Fcntl {
/*
* File access modes for `open' and `fcntl'
*/
int O_RDONLY = 00; // Open read-only.
int O_WRONLY = 01; // Open write-only.
int O_RDWR = 02; // Open read/write.

/*
* Bits OR'd into the second argument to open. Note these are defined
* differently on linux than unix fcntl header
*/
int O_CREAT = 0100; // Create file if it doesn't exist.
int O_EXCL = 0200; // Fail if file already exists.
int O_TRUNC = 01000; // Truncate file to zero length.

/* Protection bits. */
int S_IRUSR = 00400; // Read by owner.
int S_IWUSR = 00200; // Write by owner.
int S_IXUSR = 00100; // Execute by owner.
int S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;

int S_IRGRP = 00040; // Read by group.
int S_IWGRP = 00020; // Write by group.
int S_IXGRP = 00010; // Execute by group.
int S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP;

int S_IROTH = 00004; // Read by others.
int S_IWOTH = 00002; // Write by others.
int S_IXOTH = 00001; // Execute by others.
int S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH;

int S_ISUID = 04000; // set-user-ID bit
int S_ISGID = 02000; // set-group-ID bit (see inode(7)).
int S_ISVTX = 01000; // sticky bit (see inode(7)).
}
73 changes: 73 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/linux/LibRT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* Copyright (c) 2020 Daniel Widdis, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna.platform.linux;

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
* POSIX.1b Realtime Extensions library (librt). Functions in this library
* provide most of the interfaces specified by the POSIX.1b Realtime Extension.
*/
public interface LibRT extends Library {

LibRT INSTANCE = Native.load("rt", LibRT.class);

/**
* Creates and opens a new, or opens an existing, POSIX shared memory object. A
* POSIX shared memory object is in effect a handle which can be used by
* unrelated processes to {@code mmap()} the same region of shared memory.
*
* @param name
* The shared memory object to be created or opened. For portable
* use, a shared memory object should be identified by a name of the
* form {@code /somename} that is, a null-terminated string of up to
* {@code NAME_MAX} (i.e., 255) characters consisting of an initial
* slash, followed by one or more characters, none of which are
* slashes.
* @param oflag
* A bit mask created by ORing together exactly one of
* {@code O_RDONLY} or {@code O_RDWR} and any of the other flags
* {@code O_CREAT}, {@code O_EXCL}, or {@code O_TRUNC}.
* @param mode
* When {@code oflag} includes {@code O_CREAT}, the object's
* permission bits are set according to the low-order 9 bits of mode,
* except that those bits set in the process file mode creation mask
* (see {@code umask(2)}) are cleared for the new object.
* @return On success, returns a file descriptor (a nonnegative integer). On
* failure, returns -1. On failure, {@code errno} is set to indicate the
* cause of the error.
*/
int shm_open(String name, int oflag, int mode);

/**
* Removes an object previously created by {@link #shm_open}.
*
* @param name
* The shared memory object to be unlinked.
* @return returns 0 on success, or -1 on error. On failure, {@code errno} is
* set to indicate the cause of the error.
*/
int shm_unlink(String name);
}
77 changes: 77 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/linux/Mman.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/* Copyright (c) 2020 Daniel Widdis, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna.platform.linux;

import com.sun.jna.Pointer;

/**
* Definitions for POSIX memory map interface from {@code mman.h}
*/
public interface Mman {
/*
* Protections are chosen from these bits, OR'd together. The implementation
* does not necessarily support PROT_EXEC or PROT_WRITE without PROT_READ. The
* only guarantees are that no writing will be allowed without PROT_WRITE and no
* access will be allowed for PROT_NONE.
*/
int PROT_READ = 0x1; // Page can be read.
int PROT_WRITE = 0x2; // Page can be written.
int PROT_EXEC = 0x4; // Page can be executed.
int PROT_NONE = 0x0; // Page can not be accessed.
int PROT_GROWSDOWN = 0x01000000; // Extend change to start of growsdown vma (mprotect only).
int PROT_GROWSUP = 0x02000000; // Extend change to start of growsup vma (mprotect only).

/* Sharing types (must choose one and only one of these). */
int MAP_SHARED = 0x01; // Share changes.
int MAP_PRIVATE = 0x02; // Changes are private.
int MAP_SHARED_VALIDATE = 0x03; // share + validate extension flags
int MAP_TYPE = 0x0f; // Mask for type of mapping

/* Other flags. */
int MAP_FILE = 0; // Compatibility flag. Ignored.
int MAP_FIXED = 0x10; // Interpret addr exactly.
int MAP_ANONYMOUS = 0x20; // Don't use a file.
int MAP_ANON = MAP_ANONYMOUS;
int MAP_32BIT = 0x40; // Only give out 32-bit addresses.

/* These are Linux-specific. */
int MAP_GROWSDOWN = 0x00100; // Stack-like segment.
int MAP_DENYWRITE = 0x00800; // ETXTBSY
int MAP_EXECUTABLE = 0x01000; // Mark it as an executable.
int MAP_LOCKED = 0x02000; // Lock the mapping.
int MAP_NORESERVE = 0x04000; // Don't check for reservations.
int MAP_POPULATE = 0x08000; // Populate (prefault) pagetables.
int MAP_NONBLOCK = 0x10000; // Do not block on IO.
int MAP_STACK = 0x20000; // Allocation is for a stack.
int MAP_HUGETLB = 0x40000; // create a huge page mapping
int MAP_SYNC = 0x80000; // perform synchronous page faults for the mapping
int MAP_FIXED_NOREPLACE = 0x100000; // MAP_FIXED which doesn't unmap underlying mapping

Pointer MAP_FAILED = new Pointer(-1); // ((void *)-1)

/* Flags for msync. */
int MS_ASYNC = 1;
int MS_SYNC = 2;
int MS_INVALIDATE = 4;
}
Loading

0 comments on commit d471b15

Please sign in to comment.