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 <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
45__BEGIN_DECLS
46
47
48#define PROC_ALL_PIDS 		1
49#define PROC_PGRP_ONLY		2
50#define PROC_TTY_ONLY		3
51#define PROC_UID_ONLY		4
52#define PROC_RUID_ONLY		5
53
54struct proc_bsdinfo {
55	uint32_t		pbi_flags;		/* 64bit; emulated etc */
56	uint32_t		pbi_status;
57	uint32_t		pbi_xstatus;
58	uint32_t		pbi_pid;
59	uint32_t		pbi_ppid;
60	uid_t			pbi_uid;
61	gid_t			pbi_gid;
62	uid_t			pbi_ruid;
63	gid_t			pbi_rgid;
64	uid_t			pbi_svuid;
65	gid_t			pbi_svgid;
66	char			pbi_comm[MAXCOMLEN + 1];
67	char			pbi_name[2*MAXCOMLEN + 1];	/* empty if no name is registered */
68	uint32_t		pbi_nfiles;
69	uint32_t		pbi_pgid;
70	uint32_t		pbi_pjobc;
71	uint32_t		e_tdev;			/* controlling tty dev */
72	uint32_t		e_tpgid;		/* tty process group id */
73	struct timeval 		pbi_start;
74	int32_t			pbi_nice;
75};
76
77
78
79/* pbi_flags values */
80#define PROC_FLAG_SYSTEM	1
81#define PROC_FLAG_TRACED	2
82#define PROC_FLAG_INEXIT	4
83#define PROC_FLAG_PPWAIT	8
84#define PROC_FLAG_LP64		0x10
85#define PROC_FLAG_SLEADER	0x20
86#define PROC_FLAG_CTTY		0x40
87#define PROC_FLAG_CONTROLT	0x80
88#define PROC_FLAG_THCWD		0x100
89
90
91struct proc_taskinfo {
92	uint64_t		pti_virtual_size;   /* virtual memory size (bytes) */
93	uint64_t		pti_resident_size;  /* resident memory size (bytes) */
94	uint64_t		pti_total_user;		/* total time */
95	uint64_t		pti_total_system;
96	uint64_t		pti_threads_user;	/* existing threads only */
97	uint64_t		pti_threads_system;
98	int32_t			pti_policy;		/* default policy for new threads */
99	int32_t			pti_faults;		/* number of page faults */
100	int32_t			pti_pageins;	/* number of actual pageins */
101	int32_t			pti_cow_faults;	/* number of copy-on-write faults */
102	int32_t			pti_messages_sent;	/* number of messages sent */
103	int32_t			pti_messages_received; /* number of messages received */
104	int32_t			pti_syscalls_mach;  /* number of mach system calls */
105	int32_t			pti_syscalls_unix;  /* number of unix system calls */
106	int32_t			pti_csw;            /* number of context switches */
107	int32_t			pti_threadnum;		/* number of threads in the task */
108	int32_t			pti_numrunning;		/* number of running threads */
109	int32_t			pti_priority;		/* task priority*/
110};
111
112struct proc_taskallinfo {
113	struct  proc_bsdinfo pbsd;
114	struct  proc_taskinfo ptinfo;
115};
116
117
118struct proc_threadinfo {
119	uint64_t		pth_user_time;      /* user run time */
120	uint64_t		pth_system_time;    /* system run time */
121	int32_t			pth_cpu_usage;      /* scaled cpu usage percentage */
122	int32_t			pth_policy;		/* scheduling policy in effect */
123	int32_t			pth_run_state;      /* run state (see below) */
124	int32_t			pth_flags;          /* various flags (see below) */
125	int32_t			pth_sleep_time;     /* number of seconds that thread */
126	int32_t			pth_curpri;		/* cur priority*/
127	int32_t			pth_priority;		/*  priority*/
128	int32_t			pth_maxpriority;		/* max priority*/
129	char *			pth_name[64];		/* thread name, if any */
130};
131
132struct proc_regioninfo {
133	uint32_t		pri_protection;
134	uint32_t		pri_max_protection;
135	uint32_t		pri_inheritance;
136	uint32_t		pri_flags;		/* shared, external pager, is submap */
137	uint64_t		pri_offset;
138	uint32_t		pri_behavior;
139	uint32_t		pri_user_wired_count;
140	uint32_t		pri_user_tag;
141	uint32_t		pri_pages_resident;
142	uint32_t		pri_pages_shared_now_private;
143    	uint32_t		pri_pages_swapped_out;
144    	uint32_t		pri_pages_dirtied;
145    	uint32_t		pri_ref_count;
146    	uint32_t		pri_shadow_depth;
147    	uint32_t		pri_share_mode;
148	uint32_t		pri_private_pages_resident;
149	uint32_t		pri_shared_pages_resident;
150	uint32_t		pri_obj_id;
151	uint32_t		pri_depth;
152	uint64_t		pri_address;
153	uint64_t		pri_size;
154};
155
156#define PROC_REGION_SUBMAP	1
157#define PROC_REGION_SHARED	2
158
159#define SM_COW             1
160#define SM_PRIVATE         2
161#define SM_EMPTY           3
162#define SM_SHARED          4
163#define SM_TRUESHARED      5
164#define SM_PRIVATE_ALIASED 6
165#define SM_SHARED_ALIASED  7
166
167
168/*
169 *	Thread run states (state field).
170 */
171
172#define TH_STATE_RUNNING	1	/* thread is running normally */
173#define TH_STATE_STOPPED	2	/* thread is stopped */
174#define TH_STATE_WAITING	3	/* thread is waiting normally */
175#define TH_STATE_UNINTERRUPTIBLE 4	/* thread is in an uninterruptible
176					   wait */
177#define TH_STATE_HALTED		5	/* thread is halted at a
178					   clean point */
179
180/*
181 *	Thread flags (flags field).
182 */
183#define TH_FLAGS_SWAPPED	0x1	/* thread is swapped out */
184#define TH_FLAGS_IDLE		0x2	/* thread is an idle thread */
185
186
187
188struct proc_fileinfo {
189	uint32_t		fi_openflags;
190	uint32_t		fi_status;
191	off_t			fi_offset;
192	int32_t			fi_type;
193};
194
195/* stats flags in proc_fileinfo */
196#define PROC_FP_SHARED	1	/* shared by more than one fd */
197#define PROC_FP_CLEXEC	2	/* close on exec */
198
199/*
200 * A copy of stat64 with static sized fields.
201 */
202struct vinfo_stat {
203	uint32_t	vst_dev;	/* [XSI] ID of device containing file */
204	uint16_t	vst_mode;	/* [XSI] Mode of file (see below) */
205	uint16_t	vst_nlink;	/* [XSI] Number of hard links */
206	uint64_t	vst_ino;	/* [XSI] File serial number */
207	uid_t		vst_uid;	/* [XSI] User ID of the file */
208	gid_t		vst_gid;	/* [XSI] Group ID of the file */
209	int64_t		vst_atime;	/* [XSI] Time of last access */
210	int64_t		vst_atimensec;	/* nsec of last access */
211	int64_t		vst_mtime;	/* [XSI] Last data modification time */
212	int64_t		vst_mtimensec;	/* last data modification nsec */
213	int64_t		vst_ctime;	/* [XSI] Time of last status change */
214	int64_t		vst_ctimensec;	/* nsec of last status change */
215	int64_t		vst_birthtime;	/*  File creation time(birth)  */
216	int64_t		vst_birthtimensec;	/* nsec of File creation time */
217	off_t		vst_size;	/* [XSI] file size, in bytes */
218	int64_t		vst_blocks;	/* [XSI] blocks allocated for file */
219	int32_t		vst_blksize;	/* [XSI] optimal blocksize for I/O */
220	uint32_t	vst_flags;	/* user defined flags for file */
221	uint32_t	vst_gen;	/* file generation number */
222	uint32_t	vst_rdev;	/* [XSI] Device ID */
223	int64_t		vst_qspare[2];	/* RESERVED: DO NOT USE! */
224};
225
226struct vnode_info {
227	struct vinfo_stat	vi_stat;
228	int			vi_type;
229	fsid_t			vi_fsid;
230	int			vi_pad;
231};
232
233struct vnode_info_path {
234	struct vnode_info	vip_vi;
235	char vip_path[MAXPATHLEN];  /* tail end of it  */
236};
237
238struct vnode_fdinfo {
239	struct proc_fileinfo	pfi;
240	struct vnode_info	pvi;
241};
242
243struct vnode_fdinfowithpath {
244	struct proc_fileinfo pfi;
245	struct vnode_info_path pvip;
246};
247
248struct proc_regionwithpathinfo {
249	struct proc_regioninfo prp_prinfo;
250	struct vnode_info_path prp_vip;
251};
252
253struct proc_vnodepathinfo {
254	struct vnode_info_path pvi_cdir;
255	struct vnode_info_path pvi_rdir;
256};
257
258struct proc_threadwithpathinfo {
259	struct proc_threadinfo pt;
260	struct vnode_info_path pvip;
261};
262
263/*
264 *  Socket
265 */
266
267
268/*
269 * IPv4 and IPv6 Sockets
270 */
271
272#define INI_IPV4        0x1
273#define INI_IPV6        0x2
274
275struct in4in6_addr {
276        u_int32_t       i46a_pad32[3];
277        struct  in_addr i46a_addr4;
278};
279
280struct in_sockinfo {
281	int						insi_fport;		/* foreign port */
282	int						insi_lport;		/* local port */
283	uint64_t				insi_gencnt;		/* generation count of this instance */
284	uint32_t				insi_flags;		/* generic IP/datagram flags */
285	uint32_t				insi_flow;
286
287	uint8_t					insi_vflag;		/* ini_IPV4 or ini_IPV6 */
288	uint8_t					insi_ip_ttl;	/* time to live proto */
289	/* protocol dependent part */
290	union {
291		struct in4in6_addr		ina_46;
292		struct in6_addr			ina_6;
293	} 						insi_faddr;		/* foreign host table entry */
294	union {
295		struct in4in6_addr		ina_46;
296		struct in6_addr			ina_6;
297	} 						insi_laddr;		/* local host table entry */
298	struct {
299		u_char 					in4_tos;	/* type of service  */
300	} 						insi_v4;
301	struct {
302		uint8_t					in6_hlim;
303		int						in6_cksum;
304		u_short					in6_ifindex;
305		short					in6_hops;
306	} 						insi_v6;
307};
308
309/*
310 * TCP Sockets
311 */
312
313#define TSI_T_REXMT			0		/* retransmit */
314#define TSI_T_PERSIST		1		/* retransmit persistence */
315#define TSI_T_KEEP			2		/* keep alive */
316#define TSI_T_2MSL			3		/* 2*msl quiet time timer */
317#define TSI_T_NTIMERS		4
318
319#define TSI_S_CLOSED		0       /* closed */
320#define TSI_S_LISTEN		1       /* listening for connection */
321#define TSI_S_SYN_SENT		2       /* active, have sent syn */
322#define TSI_S_SYN_RECEIVED	3       /* have send and received syn */
323#define TSI_S_ESTABLISHED	4       /* established */
324#define TSI_S__CLOSE_WAIT	5       /* rcvd fin, waiting for close */
325#define TSI_S_FIN_WAIT_1	6       /* have closed, sent fin */
326#define TSI_S_CLOSING		7       /* closed xchd FIN; await FIN ACK */
327#define TSI_S_LAST_ACK		8       /* had fin and close; await FIN ACK */
328#define TSI_S_FIN_WAIT_2	9       /* have closed, fin is acked */
329#define TSI_S_TIME_WAIT		10      /* in 2*msl quiet wait after close */
330#define TSI_S_RESERVED		11      /* pseudo state: reserved */
331
332struct tcp_sockinfo {
333	struct in_sockinfo 		tcpsi_ini;
334	int 					tcpsi_state;
335	int 					tcpsi_timer[TSI_T_NTIMERS];
336	int						tcpsi_mss;
337	uint32_t				tcpsi_flags;
338	uint64_t				tcpsi_tp;	/* opaque handle of TCP protocol control block */
339};
340
341/*
342 * Unix Domain Sockets
343 */
344
345
346struct un_sockinfo {
347	uint64_t					unsi_conn_so;	/* opaque handle of connected socket */
348	uint64_t					unsi_conn_pcb;	/* opaque handle of connected protocol control block */
349	union {
350		struct  sockaddr_un 	ua_sun;
351		char					ua_dummy[SOCK_MAXADDRLEN];
352	} 							unsi_addr;		/* bound address */
353	union {
354		struct  sockaddr_un 	ua_sun;
355		char					ua_dummy[SOCK_MAXADDRLEN];
356	} 							unsi_caddr;		/* address of socket connected to */
357};
358
359/*
360 * PF_NDRV Sockets
361 */
362
363struct ndrv_info {
364	uint32_t				ndrvsi_if_family;
365	uint32_t				ndrvsi_if_unit;
366	char					ndrvsi_if_name[IF_NAMESIZE];
367};
368
369/*
370 * Kernel Event Sockets
371 */
372
373struct kern_event_info {
374     uint32_t         		kesi_vendor_code_filter;
375     uint32_t         		kesi_class_filter;
376     uint32_t         		kesi_subclass_filter;
377};
378
379/*
380 * Kernel Control Sockets
381 */
382
383struct kern_ctl_info {
384	uint32_t				kcsi_id;
385	uint32_t				kcsi_reg_unit;
386	uint32_t				kcsi_flags;                  /* support flags */
387	uint32_t				kcsi_recvbufsize;            /* request more than the default buffer size */
388	uint32_t				kcsi_sendbufsize;            /* request more than the default buffer size */
389	uint32_t				kcsi_unit;
390	char					kcsi_name[MAX_KCTL_NAME];	/* unique nke identifier, provided by DTS */
391};
392
393/* soi_state */
394
395#define SOI_S_NOFDREF				0x0001	/* no file table ref any more */
396#define SOI_S_ISCONNECTED			0x0002	/* socket connected to a peer */
397#define SOI_S_ISCONNECTING			0x0004	/* in process of connecting to peer */
398#define SOI_S_ISDISCONNECTING		0x0008	/* in process of disconnecting */
399#define SOI_S_CANTSENDMORE			0x0010	/* can't send more data to peer */
400#define SOI_S_CANTRCVMORE			0x0020	/* can't receive more data from peer */
401#define SOI_S_RCVATMARK				0x0040	/* at mark on input */
402#define SOI_S_PRIV					0x0080	/* privileged for broadcast, raw... */
403#define SOI_S_NBIO					0x0100	/* non-blocking ops */
404#define SOI_S_ASYNC					0x0200	/* async i/o notify */
405#define SOI_S_INCOMP				0x0800	/* Unaccepted, incomplete connection */
406#define SOI_S_COMP					0x1000	/* unaccepted, complete connection */
407#define SOI_S_ISDISCONNECTED		0x2000	/* socket disconnected from peer */
408#define SOI_S_DRAINING				0x4000	/* close waiting for blocked system calls to drain */
409
410struct sockbuf_info {
411	uint32_t			sbi_cc;
412	uint32_t			sbi_hiwat;			/* SO_RCVBUF, SO_SNDBUF */
413	uint32_t			sbi_mbcnt;
414	uint32_t			sbi_mbmax;
415	uint32_t			sbi_lowat;
416	short				sbi_flags;
417	short				sbi_timeo;
418};
419
420enum {
421	SOCKINFO_GENERIC 	= 0,
422	SOCKINFO_IN			= 1,
423	SOCKINFO_TCP		= 2,
424	SOCKINFO_UN			= 3,
425	SOCKINFO_NDRV		= 4,
426	SOCKINFO_KERN_EVENT	= 5,
427	SOCKINFO_KERN_CTL	= 6
428};
429
430struct socket_info {
431	struct stat 			soi_stat;
432	uint64_t				soi_so;		/* opaque handle of socket */
433	uint64_t				soi_pcb;	/* opaque handle of protocol control block */
434	int						soi_type;
435	int						soi_protocol;
436	int						soi_family;
437	short					soi_options;
438	short					soi_linger;
439	short					soi_state;
440	short					soi_qlen;
441	short					soi_incqlen;
442	short					soi_qlimit;
443	short					soi_timeo;
444	u_short					soi_error;
445	uint32_t				soi_oobmark;
446	struct sockbuf_info		soi_rcv;
447	struct sockbuf_info		soi_snd;
448	int						soi_kind;
449	union {
450		struct in_sockinfo		pri_in;			/* SOCKINFO_IN */
451		struct tcp_sockinfo		pri_tcp;		/* SOCKINFO_TCP */
452		struct un_sockinfo		pri_un;			/* SOCKINFO_UN */
453		struct ndrv_info		pri_ndrv;		/* SOCKINFO_NDRV */
454		struct kern_event_info	pri_kern_event;	/* SOCKINFO_KERN_EVENT */
455		struct kern_ctl_info	pri_kern_ctl;	/* SOCKINFO_KERN_CTL */
456	} 						soi_proto;
457};
458
459struct socket_fdinfo {
460	struct proc_fileinfo pfi;
461	struct socket_info  psi;
462};
463
464
465
466struct psem_info {
467	struct vinfo_stat 	psem_stat;
468	char			psem_name[MAXPATHLEN];
469};
470
471struct psem_fdinfo {
472	struct proc_fileinfo pfi;
473	struct psem_info	pseminfo;
474};
475
476
477
478struct pshm_info  {
479	struct vinfo_stat		pshm_stat;
480	uint64_t		pshm_mappaddr;
481	char			pshm_name[MAXPATHLEN];
482};
483
484struct pshm_fdinfo {
485	struct proc_fileinfo pfi;
486	struct pshm_info pshminfo;
487};
488
489
490struct pipe_info {
491	struct vinfo_stat pipe_stat;
492	uint64_t	pipe_handle;
493	uint64_t	pipe_peerhandle;
494	int			pipe_status;
495};
496
497struct pipe_fdinfo {
498	struct proc_fileinfo pfi;
499	struct pipe_info	pipeinfo;
500};
501
502
503struct kqueue_info {
504	struct vinfo_stat 	kq_stat;
505	uint32_t	kq_state;
506};
507#define PROC_KQUEUE_SELECT	1
508#define PROC_KQUEUE_SLEEP	2
509
510struct kqueue_fdinfo {
511	struct proc_fileinfo pfi;
512	struct kqueue_info	kqueueinfo;
513};
514
515struct appletalk_info {
516	struct vinfo_stat 	atalk_stat;
517};
518
519struct appletalk_fdinfo {
520	struct proc_fileinfo pfi;
521	struct appletalk_info appletalkinfo;
522};
523
524
525
526/* defns of process file desc type */
527#define PROX_FDTYPE_ATALK 	0
528#define PROX_FDTYPE_VNODE 	1
529#define PROX_FDTYPE_SOCKET 	2
530#define PROX_FDTYPE_PSHM 	3
531#define PROX_FDTYPE_PSEM 	4
532#define PROX_FDTYPE_KQUEUE 	5
533#define PROX_FDTYPE_PIPE 	6
534#define PROX_FDTYPE_FSEVENTS 	7
535
536struct proc_fdinfo {
537	int32_t	proc_fd;
538	uint32_t proc_fdtype;
539};
540
541/* Falvors for proc_pidinfo() */
542#define PROC_PIDLISTFDS 1
543#define PROC_PIDLISTFD_SIZE  (sizeof(struct proc_fdinfo))
544
545#define PROC_PIDTASKALLINFO 2
546#define PROC_PIDTASKALLINFO_SIZE  (sizeof(struct proc_taskallinfo))
547
548#define PROC_PIDTBSDINFO 3
549#define PROC_PIDTBSDINFO_SIZE  (sizeof(struct proc_bsdinfo))
550
551#define PROC_PIDTASKINFO 4
552#define PROC_PIDTASKINFO_SIZE  (sizeof(struct proc_taskinfo))
553
554#define PROC_PIDTHREADINFO 5
555#define PROC_PIDTHREADINFO_SIZE  (sizeof(struct proc_threadinfo))
556
557#define PROC_PIDLISTTHREADS 6
558#define PROC_PIDLISTTHREADS_SIZE  (2* sizeof(uint32_t))
559
560
561#define PROC_PIDREGIONINFO 7
562#define PROC_PIDREGIONINFO_SIZE  (sizeof(struct proc_regioninfo))
563
564#define PROC_PIDREGIONPATHINFO 8
565#define PROC_PIDREGIONPATHINFO_SIZE  (sizeof(struct proc_regionwithpathinfo))
566
567#define PROC_PIDVNODEPATHINFO 9
568#define PROC_PIDVNODEPATHINFO_SIZE  (sizeof(struct proc_vnodepathinfo))
569
570#define PROC_PIDTHREADPATHINFO 10
571#define PROC_PIDTHREADPATHINFO_SIZE  (sizeof(struct proc_threadwithpathinfo))
572
573#define PROC_PIDPATHINFO 11
574#define PROC_PIDPATHINFO_SIZE  (MAXPATHLEN)
575#define PROC_PIDPATHINFO_MAXSIZE  (4*MAXPATHLEN)
576
577/* Flavors for proc_pidfdinfo */
578
579#define PROC_PIDFDVNODEINFO 1
580#define PROC_PIDFDVNODEINFO_SIZE  (sizeof(struct vnode_fdinfo))
581
582#define PROC_PIDFDVNODEPATHINFO 2
583#define PROC_PIDFDVNODEPATHINFO_SIZE  (sizeof(struct vnode_fdinfowithpath))
584
585#define PROC_PIDFDSOCKETINFO 3
586#define PROC_PIDFDSOCKETINFO_SIZE  (sizeof(struct socket_fdinfo))
587
588#define PROC_PIDFDPSEMINFO 4
589#define PROC_PIDFDPSEMINFO_SIZE  (sizeof(struct psem_fdinfo))
590
591#define PROC_PIDFDPSHMINFO 5
592#define PROC_PIDFDPSHMINFO_SIZE  (sizeof(struct pshm_fdinfo))
593
594#define PROC_PIDFDPIPEINFO 6
595#define PROC_PIDFDPIPEINFO_SIZE  (sizeof(struct pipe_fdinfo))
596
597#define PROC_PIDFDKQUEUEINFO 7
598#define PROC_PIDFDKQUEUEINFO_SIZE  (sizeof(struct kqueue_fdinfo))
599
600#define PROC_PIDFDATALKINFO 8
601#define PROC_PIDFDATALKINFO_SIZE  (sizeof(struct appletalk_fdinfo))
602
603
604
605#ifdef XNU_KERNEL_PRIVATE
606extern int fill_socketinfo(socket_t so, struct socket_info *si);
607extern int fill_pshminfo(struct pshmnode * pshm, struct pshm_info * pinfo);
608extern int fill_pseminfo(struct psemnode * psem, struct psem_info * pinfo);
609extern int fill_pipeinfo(struct pipe * cpipe, struct pipe_info * pinfo);
610extern int fill_kqueueinfo(struct kqueue * kq, struct kqueue_info * kinfo);
611#endif /* XNU_KERNEL_PRIVATE */
612
613
614__END_DECLS
615
616#endif /*_SYS_PROC_INFO_H */
617