xref: /NextBSD/include/apple/sys/proc_info.h (revision 33da5adc555b3bc29986eeadca03829e4ad06b1e)
1 /*
2  * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _SYS_PROC_INFO_H
30 #define _SYS_PROC_INFO_H
31 
32 #include <sys/cdefs.h>
33 #include <sys/param.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <sys/mount.h>
37 #include <sys/socket.h>
38 #include <sys/un.h>
39 #include <System/sys/kern_control.h>
40 #include <net/if.h>
41 #include <net/route.h>
42 #include <netinet/in.h>
43 #include <netinet/tcp.h>
44 #ifdef __FreeBSD__
45 #include <sys/mach/machine.h>
46 #else
47 #include <mach/machine.h>
48 #endif
49 __BEGIN_DECLS
50 
51 
52 #define PROC_ALL_PIDS		1
53 #define PROC_PGRP_ONLY		2
54 #define PROC_TTY_ONLY		3
55 #define PROC_UID_ONLY		4
56 #define PROC_RUID_ONLY		5
57 #define PROC_PPID_ONLY		6
58 
59 struct proc_bsdinfo {
60 	uint32_t		pbi_flags;		/* 64bit; emulated etc */
61 	uint32_t		pbi_status;
62 	uint32_t		pbi_xstatus;
63 	uint32_t		pbi_pid;
64 	uint32_t		pbi_ppid;
65 	uid_t			pbi_uid;
66 	gid_t			pbi_gid;
67 	uid_t			pbi_ruid;
68 	gid_t			pbi_rgid;
69 	uid_t			pbi_svuid;
70 	gid_t			pbi_svgid;
71 	uint32_t		rfu_1;			/* reserved */
72 	char			pbi_comm[MAXCOMLEN];
73 	char			pbi_name[2*MAXCOMLEN];	/* empty if no name is registered */
74 	uint32_t		pbi_nfiles;
75 	uint32_t		pbi_pgid;
76 	uint32_t		pbi_pjobc;
77 	uint32_t		e_tdev;			/* controlling tty dev */
78 	uint32_t		e_tpgid;		/* tty process group id */
79 	int32_t			pbi_nice;
80 	uint64_t		pbi_start_tvsec;
81 	uint64_t		pbi_start_tvusec;
82 };
83 
84 
85 struct proc_bsdshortinfo {
86         uint32_t                pbsi_pid;		/* process id */
87         uint32_t                pbsi_ppid;		/* process parent id */
88         uint32_t                pbsi_pgid;		/* process perp id */
89 	uint32_t                pbsi_status;		/* p_stat value, SZOMB, SRUN, etc */
90 	char                    pbsi_comm[MAXCOMLEN];	/* upto 16 characters of process name */
91 	uint32_t                pbsi_flags;              /* 64bit; emulated etc */
92         uid_t                   pbsi_uid;		/* current uid on process */
93         gid_t                   pbsi_gid;		/* current gid on process */
94         uid_t                   pbsi_ruid;		/* current ruid on process */
95         gid_t                   pbsi_rgid;		/* current tgid on process */
96         uid_t                   pbsi_svuid;		/* current svuid on process */
97         gid_t                   pbsi_svgid;		/* current svgid on process */
98         uint32_t                pbsi_rfu;		/* reserved for future use*/
99 };
100 
101 
102 #ifdef  PRIVATE
103 struct proc_uniqidentifierinfo {
104 	uint8_t                 p_uuid[16];		/* UUID of the main executable */
105 	uint64_t                p_uniqueid;		/* 64 bit unique identifier for process */
106 	uint64_t                p_puniqueid;		/* unique identifier for process's parent */
107 	uint64_t                p_reserve2;		/* reserved for future use */
108 	uint64_t                p_reserve3;		/* reserved for future use */
109 	uint64_t                p_reserve4;		/* reserved for future use */
110 };
111 
112 
113 struct proc_bsdinfowithuniqid {
114 	struct proc_bsdinfo             pbsd;
115 	struct proc_uniqidentifierinfo  p_uniqidentifier;
116 };
117 
118 struct proc_archinfo {
119 	cpu_type_t		p_cputype;
120 	cpu_subtype_t		p_cpusubtype;
121 };
122 
123 struct proc_pidcoalitioninfo {
124 	uint64_t coalition_id;
125 	uint64_t reserved1;
126 	uint64_t reserved2;
127 	uint64_t reserved3;
128 };
129 
130 #endif
131 
132 
133 /* pbi_flags values */
134 #define PROC_FLAG_SYSTEM	1	/*  System process */
135 #define PROC_FLAG_TRACED	2	/* process currently being traced, possibly by gdb */
136 #define PROC_FLAG_INEXIT	4	/* process is working its way in exit() */
137 #define PROC_FLAG_PPWAIT	8
138 #define PROC_FLAG_LP64		0x10	/* 64bit process */
139 #define PROC_FLAG_SLEADER	0x20	/* The process is the session leader */
140 #define PROC_FLAG_CTTY		0x40	/* process has a control tty */
141 #define PROC_FLAG_CONTROLT	0x80	/* Has a controlling terminal */
142 #define PROC_FLAG_THCWD		0x100	/* process has a thread with cwd */
143 /* process control bits for resource starvation */
144 #define PROC_FLAG_PC_THROTTLE	0x200	/* In resource starvation situations, this process is to be throttled */
145 #define PROC_FLAG_PC_SUSP	0x400	/* In resource starvation situations, this process is to be suspended */
146 #define PROC_FLAG_PC_KILL	0x600	/* In resource starvation situations, this process is to be terminated */
147 #define PROC_FLAG_PC_MASK	0x600
148 /* process action bits for resource starvation */
149 #define PROC_FLAG_PA_THROTTLE	0x800	/* The process is currently throttled due to resource starvation */
150 #define PROC_FLAG_PA_SUSP	0x1000	/* The process is currently suspended due to resource starvation */
151 #define PROC_FLAG_PSUGID        0x2000	 /* process has set privileges since last exec */
152 #define PROC_FLAG_EXEC		0x4000	 /* process has called exec  */
153 #ifdef  PRIVATE
154 #define PROC_FLAG_DARWINBG	0x8000	/* process in darwin background */
155 #define PROC_FLAG_EXT_DARWINBG	0x10000	/* process in darwin background - external enforcement */
156 #define PROC_FLAG_IOS_APPLEDAEMON 0x20000	/* Process is apple daemon  */
157 #define PROC_FLAG_DELAYIDLESLEEP 0x40000	/* Process is marked to delay idle sleep on disk IO */
158 #define PROC_FLAG_IOS_IMPPROMOTION 0x80000	/* Process is daemon which receives importane donation  */
159 #define PROC_FLAG_ADAPTIVE              0x100000         /* Process is adaptive */
160 #define PROC_FLAG_ADAPTIVE_IMPORTANT    0x200000         /* Process is adaptive, and is currently important */
161 #define PROC_FLAG_IMPORTANCE_DONOR   0x400000 /* Process is marked as an importance donor */
162 #define PROC_FLAG_SUPPRESSED         0x800000 /* Process is suppressed */
163 #define PROC_FLAG_APPLICATION 0x1000000	/* Process is an application */
164 #define PROC_FLAG_IOS_APPLICATION PROC_FLAG_APPLICATION	/* Process is an application */
165 #endif
166 
167 
168 struct proc_taskinfo {
169 	uint64_t		pti_virtual_size;	/* virtual memory size (bytes) */
170 	uint64_t		pti_resident_size;	/* resident memory size (bytes) */
171 	uint64_t		pti_total_user;		/* total time */
172 	uint64_t		pti_total_system;
173 	uint64_t		pti_threads_user;	/* existing threads only */
174 	uint64_t		pti_threads_system;
175 	int32_t			pti_policy;		/* default policy for new threads */
176 	int32_t			pti_faults;		/* number of page faults */
177 	int32_t			pti_pageins;		/* number of actual pageins */
178 	int32_t			pti_cow_faults;		/* number of copy-on-write faults */
179 	int32_t			pti_messages_sent;	/* number of messages sent */
180 	int32_t			pti_messages_received;	/* number of messages received */
181 	int32_t			pti_syscalls_mach;	/* number of mach system calls */
182 	int32_t			pti_syscalls_unix;	/* number of unix system calls */
183 	int32_t			pti_csw;          	/* number of context switches */
184 	int32_t			pti_threadnum;		/* number of threads in the task */
185 	int32_t			pti_numrunning;		/* number of running threads */
186 	int32_t			pti_priority;		/* task priority*/
187 };
188 
189 struct proc_taskallinfo {
190 	struct proc_bsdinfo	pbsd;
191 	struct proc_taskinfo	ptinfo;
192 };
193 
194 #define MAXTHREADNAMESIZE 64
195 
196 struct proc_threadinfo {
197 	uint64_t		pth_user_time;    	/* user run time */
198 	uint64_t		pth_system_time;  	/* system run time */
199 	int32_t			pth_cpu_usage;    	/* scaled cpu usage percentage */
200 	int32_t			pth_policy;		/* scheduling policy in effect */
201 	int32_t			pth_run_state;    	/* run state (see below) */
202 	int32_t			pth_flags;        	/* various flags (see below) */
203 	int32_t			pth_sleep_time;   	/* number of seconds that thread */
204 	int32_t			pth_curpri;		/* cur priority*/
205 	int32_t			pth_priority;		/*  priority*/
206 	int32_t			pth_maxpriority;	/* max priority*/
207 	char			pth_name[MAXTHREADNAMESIZE];	/* thread name, if any */
208 };
209 
210 struct proc_regioninfo {
211 	uint32_t		pri_protection;
212 	uint32_t		pri_max_protection;
213 	uint32_t		pri_inheritance;
214 	uint32_t		pri_flags;		/* shared, external pager, is submap */
215 	uint64_t		pri_offset;
216 	uint32_t		pri_behavior;
217 	uint32_t		pri_user_wired_count;
218 	uint32_t		pri_user_tag;
219 	uint32_t		pri_pages_resident;
220 	uint32_t		pri_pages_shared_now_private;
221 	uint32_t		pri_pages_swapped_out;
222 	uint32_t		pri_pages_dirtied;
223 	uint32_t		pri_ref_count;
224 	uint32_t		pri_shadow_depth;
225 	uint32_t		pri_share_mode;
226 	uint32_t		pri_private_pages_resident;
227 	uint32_t		pri_shared_pages_resident;
228 	uint32_t		pri_obj_id;
229 	uint32_t		pri_depth;
230 	uint64_t		pri_address;
231 	uint64_t		pri_size;
232 };
233 
234 #define PROC_REGION_SUBMAP	1
235 #define PROC_REGION_SHARED	2
236 
237 #define SM_COW             1
238 #define SM_PRIVATE         2
239 #define SM_EMPTY           3
240 #define SM_SHARED          4
241 #define SM_TRUESHARED      5
242 #define SM_PRIVATE_ALIASED 6
243 #define SM_SHARED_ALIASED  7
244 #define SM_LARGE_PAGE      8
245 
246 
247 /*
248  *	Thread run states (state field).
249  */
250 
251 #define TH_STATE_RUNNING	1	/* thread is running normally */
252 #define TH_STATE_STOPPED	2	/* thread is stopped */
253 #define TH_STATE_WAITING	3	/* thread is waiting normally */
254 #define TH_STATE_UNINTERRUPTIBLE 4	/* thread is in an uninterruptible
255 					   wait */
256 #define TH_STATE_HALTED		5	/* thread is halted at a
257 					   clean point */
258 
259 /*
260  *	Thread flags (flags field).
261  */
262 #define TH_FLAGS_SWAPPED	0x1	/* thread is swapped out */
263 #define TH_FLAGS_IDLE		0x2	/* thread is an idle thread */
264 
265 
266 struct proc_workqueueinfo {
267 	uint32_t	pwq_nthreads;		/* total number of workqueue threads */
268 	uint32_t	pwq_runthreads;		/* total number of running workqueue threads */
269 	uint32_t	pwq_blockedthreads;	/* total number of blocked workqueue threads */
270 	uint32_t	pwq_state;
271 };
272 
273 /*
274  *	workqueue state (pwq_state field)
275  */
276 #define WQ_EXCEEDED_CONSTRAINED_THREAD_LIMIT	0x1
277 #define WQ_EXCEEDED_TOTAL_THREAD_LIMIT		0x2
278 
279 
280 struct proc_fileinfo {
281 	uint32_t		fi_openflags;
282 	uint32_t		fi_status;
283 	off_t			fi_offset;
284 	int32_t			fi_type;
285 	uint32_t		fi_guardflags;
286 };
287 
288 /* stats flags in proc_fileinfo */
289 #define PROC_FP_SHARED	1	/* shared by more than one fd */
290 #define PROC_FP_CLEXEC	2	/* close on exec */
291 #define PROC_FP_GUARDED	4	/* guarded fd */
292 
293 #define PROC_FI_GUARD_CLOSE		(1u << 0)
294 #define PROC_FI_GUARD_DUP		(1u << 1)
295 #define PROC_FI_GUARD_SOCKET_IPC	(1u << 2)
296 #define PROC_FI_GUARD_FILEPORT		(1u << 3)
297 
298 /*
299  * A copy of stat64 with static sized fields.
300  */
301 struct vinfo_stat {
302 	uint32_t	vst_dev;	/* [XSI] ID of device containing file */
303 	uint16_t	vst_mode;	/* [XSI] Mode of file (see below) */
304 	uint16_t	vst_nlink;	/* [XSI] Number of hard links */
305 	uint64_t	vst_ino;	/* [XSI] File serial number */
306 	uid_t		vst_uid;	/* [XSI] User ID of the file */
307 	gid_t		vst_gid;	/* [XSI] Group ID of the file */
308 	int64_t		vst_atime;	/* [XSI] Time of last access */
309 	int64_t		vst_atimensec;	/* nsec of last access */
310 	int64_t		vst_mtime;	/* [XSI] Last data modification time */
311 	int64_t		vst_mtimensec;	/* last data modification nsec */
312 	int64_t		vst_ctime;	/* [XSI] Time of last status change */
313 	int64_t		vst_ctimensec;	/* nsec of last status change */
314 	int64_t		vst_birthtime;	/*  File creation time(birth)  */
315 	int64_t		vst_birthtimensec;	/* nsec of File creation time */
316 	off_t		vst_size;	/* [XSI] file size, in bytes */
317 	int64_t		vst_blocks;	/* [XSI] blocks allocated for file */
318 	int32_t		vst_blksize;	/* [XSI] optimal blocksize for I/O */
319 	uint32_t	vst_flags;	/* user defined flags for file */
320 	uint32_t	vst_gen;	/* file generation number */
321 	uint32_t	vst_rdev;	/* [XSI] Device ID */
322 	int64_t		vst_qspare[2];	/* RESERVED: DO NOT USE! */
323 };
324 
325 struct vnode_info {
326 	struct vinfo_stat	vi_stat;
327 	int			vi_type;
328 	int			vi_pad;
329 	fsid_t			vi_fsid;
330 };
331 
332 struct vnode_info_path {
333 	struct vnode_info	vip_vi;
334 	char			vip_path[MAXPATHLEN];	/* tail end of it  */
335 };
336 
337 struct vnode_fdinfo {
338 	struct proc_fileinfo	pfi;
339 	struct vnode_info	pvi;
340 };
341 
342 struct vnode_fdinfowithpath {
343 	struct proc_fileinfo	pfi;
344 	struct vnode_info_path	pvip;
345 };
346 
347 struct proc_regionwithpathinfo {
348 	struct proc_regioninfo	prp_prinfo;
349 	struct vnode_info_path	prp_vip;
350 };
351 
352 struct proc_vnodepathinfo {
353 	struct vnode_info_path	pvi_cdir;
354 	struct vnode_info_path	pvi_rdir;
355 };
356 
357 struct proc_threadwithpathinfo {
358 	struct proc_threadinfo	pt;
359 	struct vnode_info_path	pvip;
360 };
361 
362 /*
363  *  Socket
364  */
365 
366 
367 /*
368  * IPv4 and IPv6 Sockets
369  */
370 
371 #define INI_IPV4        0x1
372 #define INI_IPV6        0x2
373 
374 struct in4in6_addr {
375 	u_int32_t		i46a_pad32[3];
376 	struct in_addr		i46a_addr4;
377 };
378 
379 struct in_sockinfo {
380 	int					insi_fport;		/* foreign port */
381 	int					insi_lport;		/* local port */
382 	uint64_t				insi_gencnt;		/* generation count of this instance */
383 	uint32_t				insi_flags;		/* generic IP/datagram flags */
384 	uint32_t				insi_flow;
385 
386 	uint8_t					insi_vflag;		/* ini_IPV4 or ini_IPV6 */
387 	uint8_t					insi_ip_ttl;		/* time to live proto */
388 	uint32_t				rfu_1;			/* reserved */
389 	/* protocol dependent part */
390 	union {
391 		struct in4in6_addr	ina_46;
392 		struct in6_addr		ina_6;
393 	}					insi_faddr;		/* foreign host table entry */
394 	union {
395 		struct in4in6_addr	ina_46;
396 		struct in6_addr		ina_6;
397 	}					insi_laddr;		/* local host table entry */
398 	struct {
399 		u_char			in4_tos;			/* type of service */
400 	}					insi_v4;
401 	struct {
402 		uint8_t			in6_hlim;
403 		int			in6_cksum;
404 		u_short			in6_ifindex;
405 		short			in6_hops;
406 	}					insi_v6;
407 };
408 
409 /*
410  * TCP Sockets
411  */
412 
413 #define TSI_T_REXMT		0	/* retransmit */
414 #define TSI_T_PERSIST		1	/* retransmit persistence */
415 #define TSI_T_KEEP		2	/* keep alive */
416 #define TSI_T_2MSL		3	/* 2*msl quiet time timer */
417 #define TSI_T_NTIMERS		4
418 
419 #define TSI_S_CLOSED		0	/* closed */
420 #define TSI_S_LISTEN		1	/* listening for connection */
421 #define TSI_S_SYN_SENT		2	/* active, have sent syn */
422 #define TSI_S_SYN_RECEIVED	3	/* have send and received syn */
423 #define TSI_S_ESTABLISHED	4	/* established */
424 #define TSI_S__CLOSE_WAIT	5	/* rcvd fin, waiting for close */
425 #define TSI_S_FIN_WAIT_1	6	/* have closed, sent fin */
426 #define TSI_S_CLOSING		7	/* closed xchd FIN; await FIN ACK */
427 #define TSI_S_LAST_ACK		8	/* had fin and close; await FIN ACK */
428 #define TSI_S_FIN_WAIT_2	9	/* have closed, fin is acked */
429 #define TSI_S_TIME_WAIT		10	/* in 2*msl quiet wait after close */
430 #define TSI_S_RESERVED		11	/* pseudo state: reserved */
431 
432 struct tcp_sockinfo {
433 	struct in_sockinfo		tcpsi_ini;
434 	int				tcpsi_state;
435 	int				tcpsi_timer[TSI_T_NTIMERS];
436 	int				tcpsi_mss;
437 	uint32_t			tcpsi_flags;
438 	uint32_t			rfu_1;		/* reserved */
439 	uint64_t			tcpsi_tp;	/* opaque handle of TCP protocol control block */
440 };
441 
442 /*
443  * Unix Domain Sockets
444  */
445 
446 
447 struct un_sockinfo {
448 	uint64_t				unsi_conn_so;	/* opaque handle of connected socket */
449 	uint64_t				unsi_conn_pcb;	/* opaque handle of connected protocol control block */
450 	union {
451 		struct sockaddr_un	ua_sun;
452 		char			ua_dummy[SOCK_MAXADDRLEN];
453 	}					unsi_addr;	/* bound address */
454 	union {
455 		struct sockaddr_un	ua_sun;
456 		char			ua_dummy[SOCK_MAXADDRLEN];
457 	}					unsi_caddr;	/* address of socket connected to */
458 };
459 
460 /*
461  * PF_NDRV Sockets
462  */
463 
464 struct ndrv_info {
465 	uint32_t	ndrvsi_if_family;
466 	uint32_t	ndrvsi_if_unit;
467 	char		ndrvsi_if_name[IF_NAMESIZE];
468 };
469 
470 /*
471  * Kernel Event Sockets
472  */
473 
474 struct kern_event_info {
475 	uint32_t	kesi_vendor_code_filter;
476 	uint32_t	kesi_class_filter;
477 	uint32_t	kesi_subclass_filter;
478 };
479 
480 /*
481  * Kernel Control Sockets
482  */
483 
484 struct kern_ctl_info {
485 	uint32_t	kcsi_id;
486 	uint32_t	kcsi_reg_unit;
487 	uint32_t	kcsi_flags;                	/* support flags */
488 	uint32_t	kcsi_recvbufsize;          	/* request more than the default buffer size */
489 	uint32_t	kcsi_sendbufsize;          	/* request more than the default buffer size */
490 	uint32_t	kcsi_unit;
491 	char		kcsi_name[MAX_KCTL_NAME];	/* unique nke identifier, provided by DTS */
492 };
493 
494 /* soi_state */
495 
496 #define SOI_S_NOFDREF		0x0001	/* no file table ref any more */
497 #define SOI_S_ISCONNECTED	0x0002	/* socket connected to a peer */
498 #define SOI_S_ISCONNECTING	0x0004	/* in process of connecting to peer */
499 #define SOI_S_ISDISCONNECTING	0x0008	/* in process of disconnecting */
500 #define SOI_S_CANTSENDMORE	0x0010	/* can't send more data to peer */
501 #define SOI_S_CANTRCVMORE	0x0020	/* can't receive more data from peer */
502 #define SOI_S_RCVATMARK		0x0040	/* at mark on input */
503 #define SOI_S_PRIV		0x0080	/* privileged for broadcast, raw... */
504 #define SOI_S_NBIO		0x0100	/* non-blocking ops */
505 #define SOI_S_ASYNC		0x0200	/* async i/o notify */
506 #define SOI_S_INCOMP		0x0800	/* Unaccepted, incomplete connection */
507 #define SOI_S_COMP		0x1000	/* unaccepted, complete connection */
508 #define SOI_S_ISDISCONNECTED	0x2000	/* socket disconnected from peer */
509 #define SOI_S_DRAINING		0x4000	/* close waiting for blocked system calls to drain */
510 
511 struct sockbuf_info {
512 	uint32_t		sbi_cc;
513 	uint32_t		sbi_hiwat;			/* SO_RCVBUF, SO_SNDBUF */
514 	uint32_t		sbi_mbcnt;
515 	uint32_t		sbi_mbmax;
516 	uint32_t		sbi_lowat;
517 	short			sbi_flags;
518 	short			sbi_timeo;
519 };
520 
521 enum {
522 	SOCKINFO_GENERIC	= 0,
523 	SOCKINFO_IN		= 1,
524 	SOCKINFO_TCP		= 2,
525 	SOCKINFO_UN		= 3,
526 	SOCKINFO_NDRV		= 4,
527 	SOCKINFO_KERN_EVENT	= 5,
528 	SOCKINFO_KERN_CTL	= 6
529 };
530 
531 struct socket_info {
532 	struct vinfo_stat			soi_stat;
533 	uint64_t				soi_so;		/* opaque handle of socket */
534 	uint64_t				soi_pcb;	/* opaque handle of protocol control block */
535 	int					soi_type;
536 	int					soi_protocol;
537 	int					soi_family;
538 	short					soi_options;
539 	short					soi_linger;
540 	short					soi_state;
541 	short					soi_qlen;
542 	short					soi_incqlen;
543 	short					soi_qlimit;
544 	short					soi_timeo;
545 	u_short					soi_error;
546 	uint32_t				soi_oobmark;
547 	struct sockbuf_info			soi_rcv;
548 	struct sockbuf_info			soi_snd;
549 	int					soi_kind;
550 	uint32_t				rfu_1;		/* reserved */
551 	union {
552 		struct in_sockinfo	pri_in;			/* SOCKINFO_IN */
553 		struct tcp_sockinfo	pri_tcp;		/* SOCKINFO_TCP */
554 		struct un_sockinfo	pri_un;			/* SOCKINFO_UN */
555 		struct ndrv_info	pri_ndrv;		/* SOCKINFO_NDRV */
556 		struct kern_event_info	pri_kern_event;		/* SOCKINFO_KERN_EVENT */
557 		struct kern_ctl_info	pri_kern_ctl;		/* SOCKINFO_KERN_CTL */
558 	}					soi_proto;
559 };
560 
561 struct socket_fdinfo {
562 	struct proc_fileinfo	pfi;
563 	struct socket_info	psi;
564 };
565 
566 
567 
568 struct psem_info {
569 	struct vinfo_stat	psem_stat;
570 	char			psem_name[MAXPATHLEN];
571 };
572 
573 struct psem_fdinfo {
574 	struct proc_fileinfo	pfi;
575 	struct psem_info	pseminfo;
576 };
577 
578 
579 
580 struct pshm_info  {
581 	struct vinfo_stat	pshm_stat;
582 	uint64_t		pshm_mappaddr;
583 	char			pshm_name[MAXPATHLEN];
584 };
585 
586 struct pshm_fdinfo {
587 	struct proc_fileinfo	pfi;
588 	struct pshm_info	pshminfo;
589 };
590 
591 
592 struct pipe_info {
593 	struct vinfo_stat	pipe_stat;
594 	uint64_t		pipe_handle;
595 	uint64_t		pipe_peerhandle;
596 	int			pipe_status;
597 	int			rfu_1;	/* reserved */
598 };
599 
600 struct pipe_fdinfo {
601 	struct proc_fileinfo	pfi;
602 	struct pipe_info	pipeinfo;
603 };
604 
605 
606 struct kqueue_info {
607 	struct vinfo_stat	kq_stat;
608 	uint32_t		kq_state;
609 	uint32_t		rfu_1;	/* reserved */
610 };
611 #define PROC_KQUEUE_SELECT	1
612 #define PROC_KQUEUE_SLEEP	2
613 
614 struct kqueue_fdinfo {
615 	struct proc_fileinfo	pfi;
616 	struct kqueue_info	kqueueinfo;
617 };
618 
619 struct appletalk_info {
620 	struct vinfo_stat	atalk_stat;
621 };
622 
623 struct appletalk_fdinfo {
624 	struct proc_fileinfo	pfi;
625 	struct appletalk_info	appletalkinfo;
626 };
627 
628 
629 
630 /* defns of process file desc type */
631 #define PROX_FDTYPE_ATALK	0
632 #define PROX_FDTYPE_VNODE	1
633 #define PROX_FDTYPE_SOCKET	2
634 #define PROX_FDTYPE_PSHM	3
635 #define PROX_FDTYPE_PSEM	4
636 #define PROX_FDTYPE_KQUEUE	5
637 #define PROX_FDTYPE_PIPE	6
638 #define PROX_FDTYPE_FSEVENTS	7
639 
640 struct proc_fdinfo {
641 	int32_t			proc_fd;
642 	uint32_t		proc_fdtype;
643 };
644 
645 struct proc_fileportinfo {
646 	uint32_t		proc_fileport;
647 	uint32_t		proc_fdtype;
648 };
649 
650 /* Flavors for proc_pidinfo() */
651 #define PROC_PIDLISTFDS			1
652 #define PROC_PIDLISTFD_SIZE		(sizeof(struct proc_fdinfo))
653 
654 #define PROC_PIDTASKALLINFO		2
655 #define PROC_PIDTASKALLINFO_SIZE	(sizeof(struct proc_taskallinfo))
656 
657 #define PROC_PIDTBSDINFO		3
658 #define PROC_PIDTBSDINFO_SIZE		(sizeof(struct proc_bsdinfo))
659 
660 #define PROC_PIDTASKINFO		4
661 #define PROC_PIDTASKINFO_SIZE		(sizeof(struct proc_taskinfo))
662 
663 #define PROC_PIDTHREADINFO		5
664 #define PROC_PIDTHREADINFO_SIZE		(sizeof(struct proc_threadinfo))
665 
666 #define PROC_PIDLISTTHREADS		6
667 #define PROC_PIDLISTTHREADS_SIZE	(2* sizeof(uint32_t))
668 
669 
670 #define PROC_PIDREGIONINFO		7
671 #define PROC_PIDREGIONINFO_SIZE		(sizeof(struct proc_regioninfo))
672 
673 #define PROC_PIDREGIONPATHINFO		8
674 #define PROC_PIDREGIONPATHINFO_SIZE	(sizeof(struct proc_regionwithpathinfo))
675 
676 #define PROC_PIDVNODEPATHINFO		9
677 #define PROC_PIDVNODEPATHINFO_SIZE	(sizeof(struct proc_vnodepathinfo))
678 
679 #define PROC_PIDTHREADPATHINFO		10
680 #define PROC_PIDTHREADPATHINFO_SIZE	(sizeof(struct proc_threadwithpathinfo))
681 
682 #define PROC_PIDPATHINFO		11
683 #define PROC_PIDPATHINFO_SIZE		(MAXPATHLEN)
684 #define PROC_PIDPATHINFO_MAXSIZE	(4*MAXPATHLEN)
685 
686 #define PROC_PIDWORKQUEUEINFO		12
687 #define PROC_PIDWORKQUEUEINFO_SIZE	(sizeof(struct proc_workqueueinfo))
688 
689 #define PROC_PIDT_SHORTBSDINFO		13
690 #define PROC_PIDT_SHORTBSDINFO_SIZE	(sizeof(struct proc_bsdshortinfo))
691 
692 #define PROC_PIDLISTFILEPORTS		14
693 #define PROC_PIDLISTFILEPORTS_SIZE	(sizeof(struct proc_fileportinfo))
694 
695 #define PROC_PIDTHREADID64INFO		15
696 #define PROC_PIDTHREADID64INFO_SIZE	(sizeof(struct proc_threadinfo))
697 
698 #define PROC_PID_RUSAGE			16
699 #define PROC_PID_RUSAGE_SIZE		0
700 
701 #ifdef  PRIVATE
702 #define PROC_PIDUNIQIDENTIFIERINFO	17
703 #define PROC_PIDUNIQIDENTIFIERINFO_SIZE \
704                                   	(sizeof(struct proc_uniqidentifierinfo))
705 
706 #define PROC_PIDT_BSDINFOWITHUNIQID	18
707 #define PROC_PIDT_BSDINFOWITHUNIQID_SIZE \
708                                  	(sizeof(struct proc_bsdinfowithuniqid))
709 
710 #define PROC_PIDARCHINFO		19
711 #define PROC_PIDARCHINFO_SIZE		\
712 					(sizeof(struct proc_archinfo))
713 
714 #define PROC_PIDCOALITIONINFO		20
715 #define PROC_PIDCOALITIONINFO_SIZE	(sizeof(struct proc_pidcoalitioninfo))
716 
717 #define PROC_PIDNOTEEXIT		21
718 #define PROC_PIDNOTEEXIT_SIZE		(sizeof(uint32_t))
719 
720 #define PROC_PIDREGIONPATHINFO2		22
721 #define PROC_PIDREGIONPATHINFO2_SIZE	(sizeof(struct proc_regionwithpathinfo))
722 
723 #define PROC_PIDREGIONPATHINFO3		23
724 #define PROC_PIDREGIONPATHINFO3_SIZE	(sizeof(struct proc_regionwithpathinfo))
725 
726 #endif
727 
728 /* Flavors for proc_pidfdinfo */
729 
730 #define PROC_PIDFDVNODEINFO		1
731 #define PROC_PIDFDVNODEINFO_SIZE	(sizeof(struct vnode_fdinfo))
732 
733 #define PROC_PIDFDVNODEPATHINFO		2
734 #define PROC_PIDFDVNODEPATHINFO_SIZE	(sizeof(struct vnode_fdinfowithpath))
735 
736 #define PROC_PIDFDSOCKETINFO		3
737 #define PROC_PIDFDSOCKETINFO_SIZE	(sizeof(struct socket_fdinfo))
738 
739 #define PROC_PIDFDPSEMINFO		4
740 #define PROC_PIDFDPSEMINFO_SIZE		(sizeof(struct psem_fdinfo))
741 
742 #define PROC_PIDFDPSHMINFO		5
743 #define PROC_PIDFDPSHMINFO_SIZE		(sizeof(struct pshm_fdinfo))
744 
745 #define PROC_PIDFDPIPEINFO		6
746 #define PROC_PIDFDPIPEINFO_SIZE		(sizeof(struct pipe_fdinfo))
747 
748 #define PROC_PIDFDKQUEUEINFO		7
749 #define PROC_PIDFDKQUEUEINFO_SIZE	(sizeof(struct kqueue_fdinfo))
750 
751 #define PROC_PIDFDATALKINFO		8
752 #define PROC_PIDFDATALKINFO_SIZE	(sizeof(struct appletalk_fdinfo))
753 
754 /* Flavors for proc_pidfileportinfo */
755 
756 #define PROC_PIDFILEPORTVNODEPATHINFO	2	/* out: vnode_fdinfowithpath */
757 #define PROC_PIDFILEPORTVNODEPATHINFO_SIZE	\
758 					PROC_PIDFDVNODEPATHINFO_SIZE
759 
760 #define PROC_PIDFILEPORTSOCKETINFO	3	/* out: socket_fdinfo */
761 #define PROC_PIDFILEPORTSOCKETINFO_SIZE	PROC_PIDFDSOCKETINFO_SIZE
762 
763 #define PROC_PIDFILEPORTPSHMINFO	5	/* out: pshm_fdinfo */
764 #define PROC_PIDFILEPORTPSHMINFO_SIZE	PROC_PIDFDPSHMINFO_SIZE
765 
766 #define PROC_PIDFILEPORTPIPEINFO	6	/* out: pipe_fdinfo */
767 #define PROC_PIDFILEPORTPIPEINFO_SIZE	PROC_PIDFDPIPEINFO_SIZE
768 
769 /* used for proc_setcontrol */
770 #define PROC_SELFSET_PCONTROL		1
771 
772 #define PROC_SELFSET_THREADNAME		2
773 #define PROC_SELFSET_THREADNAME_SIZE	(MAXTHREADNAMESIZE -1)
774 
775 #define PROC_SELFSET_VMRSRCOWNER	3
776 
777 #define PROC_SELFSET_DELAYIDLESLEEP	4
778 
779 /* used for proc_dirtycontrol */
780 #define PROC_DIRTYCONTROL_TRACK         1
781 #define PROC_DIRTYCONTROL_SET           2
782 #define PROC_DIRTYCONTROL_GET           3
783 #define PROC_DIRTYCONTROL_CLEAR         4
784 
785 /* proc_track_dirty() flags */
786 #define PROC_DIRTY_TRACK                0x1
787 #define PROC_DIRTY_ALLOW_IDLE_EXIT      0x2
788 #define PROC_DIRTY_DEFER                0x4
789 #define PROC_DIRTY_LAUNCH_IN_PROGRESS   0x8
790 
791 /* proc_get_dirty() flags */
792 #define PROC_DIRTY_TRACKED              0x1
793 #define PROC_DIRTY_ALLOWS_IDLE_EXIT     0x2
794 #define PROC_DIRTY_IS_DIRTY             0x4
795 #define PROC_DIRTY_LAUNCH_IS_IN_PROGRESS   0x8
796 
797 #ifdef PRIVATE
798 
799 /* Flavors for proc_pidoriginatorinfo */
800 #define PROC_PIDORIGINATOR_UUID		0x1
801 #define PROC_PIDORIGINATOR_UUID_SIZE	(sizeof(uuid_t))
802 
803 #define PROC_PIDORIGINATOR_BGSTATE	0x2
804 #define PROC_PIDORIGINATOR_BGSTATE_SIZE (sizeof(uint32_t))
805 
806 /* __proc_info() call numbers */
807 #define PROC_INFO_CALL_LISTPIDS         0x1
808 #define PROC_INFO_CALL_PIDINFO          0x2
809 #define PROC_INFO_CALL_PIDFDINFO        0x3
810 #define PROC_INFO_CALL_KERNMSGBUF       0x4
811 #define PROC_INFO_CALL_SETCONTROL       0x5
812 #define PROC_INFO_CALL_PIDFILEPORTINFO  0x6
813 #define PROC_INFO_CALL_TERMINATE        0x7
814 #define PROC_INFO_CALL_DIRTYCONTROL     0x8
815 #define PROC_INFO_CALL_PIDRUSAGE        0x9
816 #define PROC_INFO_CALL_PIDORIGINATORINFO 0xa
817 
818 #endif /* PRIVATE */
819 
820 #ifdef XNU_KERNEL_PRIVATE
821 #ifndef pshmnode
822 struct pshmnode;
823 #endif
824 
825 #ifndef psemnode
826 struct psemnode ;
827 #endif
828 
829 #ifndef pipe
830 struct pipe;
831 #endif
832 
833 extern int fill_socketinfo(socket_t so, struct socket_info *si);
834 extern int fill_pshminfo(struct pshmnode * pshm, struct pshm_info * pinfo);
835 extern int fill_pseminfo(struct psemnode * psem, struct psem_info * pinfo);
836 extern int fill_pipeinfo(struct pipe * cpipe, struct pipe_info * pinfo);
837 extern int fill_kqueueinfo(struct kqueue * kq, struct kqueue_info * kinfo);
838 extern int fill_procworkqueue(proc_t, struct proc_workqueueinfo *);
839 #endif /* XNU_KERNEL_PRIVATE */
840 
841 __END_DECLS
842 
843 #endif /*_SYS_PROC_INFO_H */
844