View Javadoc
1   /*
2    * Copyright 2017-2022 The OSHI Project Contributors
3    * SPDX-License-Identifier: MIT
4    */
5   package oshi.jna.platform.unix;
6   
7   import com.sun.jna.Library;
8   import com.sun.jna.NativeLong;
9   import com.sun.jna.Pointer;
10  import com.sun.jna.Structure;
11  import com.sun.jna.Structure.FieldOrder;
12  import com.sun.jna.platform.unix.LibCAPI;
13  import com.sun.jna.ptr.PointerByReference;
14  
15  import oshi.util.Util;
16  
17  /**
18   * C library with code common to all *nix-based operating systems. This class should be considered non-API as it may be
19   * removed if/when its code is incorporated into the JNA project.
20   */
21  public interface CLibrary extends LibCAPI, Library {
22  
23      int AI_CANONNAME = 2;
24  
25      int UT_LINESIZE = 32;
26      int UT_NAMESIZE = 32;
27      int UT_HOSTSIZE = 256;
28      int LOGIN_PROCESS = 6; // Session leader of a logged in user.
29      int USER_PROCESS = 7; // Normal process.
30  
31      @FieldOrder({ "sa_family", "sa_data" })
32      class Sockaddr extends Structure {
33          public short sa_family;
34          public byte[] sa_data = new byte[14];
35  
36          public static class ByReference extends Sockaddr implements Structure.ByReference {
37          }
38      }
39  
40      @FieldOrder({ "ai_flags", "ai_family", "ai_socktype", "ai_protocol", "ai_addrlen", "ai_addr", "ai_canonname",
41              "ai_next" })
42      class Addrinfo extends Structure implements AutoCloseable {
43          public int ai_flags;
44          public int ai_family;
45          public int ai_socktype;
46          public int ai_protocol;
47          public int ai_addrlen;
48          public Sockaddr.ByReference ai_addr;
49          public String ai_canonname;
50          public ByReference ai_next;
51  
52          public static class ByReference extends Addrinfo implements Structure.ByReference {
53          }
54  
55          public Addrinfo() {
56          }
57  
58          public Addrinfo(Pointer p) {
59              super(p);
60              read();
61          }
62  
63          @Override
64          public void close() {
65              Util.freeMemory(getPointer());
66          }
67      }
68  
69      /*
70       * Between macOS and FreeBSD there are multiple versions of some tcp/udp/ip stats structures. Since we only need a
71       * few of the hundreds of fields, we can improve performance by selectively reading the ints from the appropriate
72       * offsets, which are consistent across the structure. These classes include the common fields and offsets.
73       */
74  
75      class BsdTcpstat {
76          public int tcps_connattempt; // 0
77          public int tcps_accepts; // 4
78          public int tcps_drops; // 12
79          public int tcps_conndrops; // 16
80          public int tcps_sndpack; // 64
81          public int tcps_sndrexmitpack; // 72
82          public int tcps_rcvpack; // 104
83          public int tcps_rcvbadsum; // 112
84          public int tcps_rcvbadoff; // 116
85          public int tcps_rcvmemdrop; // 120
86          public int tcps_rcvshort; // 124
87      }
88  
89      class BsdUdpstat {
90          public int udps_ipackets; // 0
91          public int udps_hdrops; // 4
92          public int udps_badsum; // 8
93          public int udps_badlen; // 12
94          public int udps_opackets; // 36
95          public int udps_noportmcast; // 48
96          public int udps_rcv6_swcsum; // 64
97          public int udps_snd6_swcsum; // 89
98      }
99  
100     class BsdIpstat {
101         public int ips_total; // 0
102         public int ips_badsum; // 4
103         public int ips_tooshort; // 8
104         public int ips_toosmall; // 12
105         public int ips_badhlen; // 16
106         public int ips_badlen; // 20
107         public int ips_delivered; // 56
108     }
109 
110     class BsdIp6stat {
111         public long ip6s_total; // 0
112         public long ip6s_localout; // 88
113     }
114 
115     /**
116      * Returns the process ID of the calling process. The ID is guaranteed to be unique and is useful for constructing
117      * temporary file names.
118      *
119      * @return the process ID of the calling process.
120      */
121     int getpid();
122 
123     /**
124      * Given node and service, which identify an Internet host and a service, getaddrinfo() returns one or more addrinfo
125      * structures, each of which contains an Internet address that can be specified in a call to bind(2) or connect(2).
126      *
127      * @param node    a numerical network address or a network hostname, whose network addresses are looked up and
128      *                resolved.
129      * @param service sets the port in each returned address structure.
130      * @param hints   specifies criteria for selecting the socket address structures returned in the list pointed to by
131      *                res.
132      * @param res     returned address structure
133      * @return 0 on success; sets errno on failure
134      */
135     int getaddrinfo(String node, String service, Addrinfo hints, PointerByReference res);
136 
137     /**
138      * Frees the memory that was allocated for the dynamically allocated linked list res.
139      *
140      * @param res Pointer to linked list returned by getaddrinfo
141      */
142     void freeaddrinfo(Pointer res);
143 
144     /**
145      * Translates getaddrinfo error codes to a human readable string, suitable for error reporting.
146      *
147      * @param e Error code from getaddrinfo
148      * @return A human-readable version of the error code
149      */
150     String gai_strerror(int e);
151 
152     /**
153      * Rewinds the file pointer to the beginning of the utmp file. It is generally a good idea to call it before any of
154      * the other functions.
155      */
156     void setutxent();
157 
158     /**
159      * Closes the utmp file. It should be called when the user code is done accessing the file with the other functions.
160      */
161     void endutxent();
162 
163     /**
164      * The sysctl() function retrieves system information and allows processes with appropriate privileges to set system
165      * information. The information available from sysctl() consists of integers, strings, and tables.
166      *
167      * The state is described using a "Management Information Base" (MIB) style name, listed in name, which is a namelen
168      * length array of integers.
169      *
170      * The information is copied into the buffer specified by oldp. The size of the buffer is given by the location
171      * specified by oldlenp before the call, and that location gives the amount of data copied after a successful call
172      * and after a call that returns with the error code ENOMEM. If the amount of data available is greater than the
173      * size of the buffer supplied, the call supplies as much data as fits in the buffer provided and returns with the
174      * error code ENOMEM. If the old value is not desired, oldp and oldlenp should be set to NULL.
175      *
176      * The size of the available data can be determined by calling sysctl() with the NULL argument for oldp. The size of
177      * the available data will be returned in the location pointed to by oldlenp. For some operations, the amount of
178      * space may change often. For these operations, the system attempts to round up so that the returned size is large
179      * enough for a call to return the data shortly thereafter.
180      *
181      * To set a new value, newp is set to point to a buffer of length newlen from which the requested value is to be
182      * taken. If a new value is not to be set, newp should be set to NULL and newlen set to 0.
183      *
184      * @param name    MIB array of integers
185      * @param namelen length of the MIB array
186      * @param oldp    Information retrieved
187      * @param oldlenp Size of information retrieved
188      * @param newp    Information to be written
189      * @param newlen  Size of information to be written
190      * @return 0 on success; sets errno on failure
191      */
192     int sysctl(int[] name, int namelen, Pointer oldp, size_t.ByReference oldlenp, Pointer newp, size_t newlen);
193 
194     /**
195      * The sysctlbyname() function accepts an ASCII representation of the name and internally looks up the integer name
196      * vector. Apart from that, it behaves the same as the standard sysctl() function.
197      *
198      * @param name    ASCII representation of the MIB name
199      * @param oldp    Information retrieved
200      * @param oldlenp Size of information retrieved
201      * @param newp    Information to be written
202      * @param newlen  Size of information to be written
203      * @return 0 on success; sets errno on failure
204      */
205     int sysctlbyname(String name, Pointer oldp, size_t.ByReference oldlenp, Pointer newp, size_t newlen);
206 
207     /**
208      * The sysctlnametomib() function accepts an ASCII representation of the name, looks up the integer name vector, and
209      * returns the numeric representation in the mib array pointed to by mibp. The number of elements in the mib array
210      * is given by the location specified by sizep before the call, and that location gives the number of entries copied
211      * after a successful call. The resulting mib and size may be used in subsequent sysctl() calls to get the data
212      * associated with the requested ASCII name. This interface is intended for use by applications that want to
213      * repeatedly request the same variable (the sysctl() function runs in about a third the time as the same request
214      * made via the sysctlbyname() function).
215      *
216      * The number of elements in the mib array can be determined by calling sysctlnametomib() with the NULL argument for
217      * mibp.
218      *
219      * The sysctlnametomib() function is also useful for fetching mib prefixes. If size on input is greater than the
220      * number of elements written, the array still contains the additional elements which may be written
221      * programmatically.
222      *
223      * @param name  ASCII representation of the name
224      * @param mibp  Integer array containing the corresponding name vector.
225      * @param sizep On input, number of elements in the returned array; on output, the number of entries copied.
226      * @return 0 on success; sets errno on failure
227      */
228     int sysctlnametomib(String name, Pointer mibp, size_t.ByReference sizep);
229 
230     int open(String absolutePath, int i);
231 
232     // Last argument is really off_t
233     ssize_t pread(int fildes, Pointer buf, size_t nbyte, NativeLong offset);
234 }