1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build ignore
6
7/*
8Input to cgo -godefs.  See README.md
9*/
10
11// +godefs map struct_in_addr [4]byte /* in_addr */
12// +godefs map struct_in6_addr [16]byte /* in6_addr */
13
14package unix
15
16/*
17#define _LARGEFILE_SOURCE
18#define _LARGEFILE64_SOURCE
19#define _FILE_OFFSET_BITS 64
20#define _GNU_SOURCE
21
22#include <dirent.h>
23#include <netinet/in.h>
24#include <netinet/tcp.h>
25#include <netpacket/packet.h>
26#include <poll.h>
27#include <signal.h>
28#include <stdio.h>
29#include <sys/epoll.h>
30#include <sys/inotify.h>
31#include <sys/ioctl.h>
32#include <sys/mman.h>
33#include <sys/mount.h>
34#include <sys/param.h>
35#include <sys/ptrace.h>
36#include <sys/resource.h>
37#include <sys/select.h>
38#include <sys/signal.h>
39#include <sys/statfs.h>
40#include <sys/sysinfo.h>
41#include <sys/time.h>
42#include <sys/times.h>
43#include <sys/timex.h>
44#include <sys/un.h>
45#include <sys/user.h>
46#include <sys/utsname.h>
47#include <sys/wait.h>
48#include <linux/filter.h>
49#include <linux/keyctl.h>
50#include <linux/netlink.h>
51#include <linux/perf_event.h>
52#include <linux/rtnetlink.h>
53#include <linux/icmpv6.h>
54#include <asm/termbits.h>
55#include <asm/ptrace.h>
56#include <time.h>
57#include <unistd.h>
58#include <ustat.h>
59#include <utime.h>
60#include <linux/can.h>
61#include <linux/if_alg.h>
62#include <linux/fs.h>
63#include <linux/vm_sockets.h>
64#include <linux/random.h>
65
66// On mips64, the glibc stat and kernel stat do not agree
67#if (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64)
68
69// Use the stat defined by the kernel with a few modifications. These are:
70//	* The time fields (like st_atime and st_atimensec) use the timespec
71//	  struct (like st_atim) for consitancy with the glibc fields.
72//	* The padding fields get different names to not break compatibility.
73//	* st_blocks is signed, again for compatibility.
74struct stat {
75	unsigned int		st_dev;
76	unsigned int		st_pad1[3]; // Reserved for st_dev expansion
77
78	unsigned long		st_ino;
79
80	mode_t			st_mode;
81	__u32			st_nlink;
82
83	uid_t			st_uid;
84	gid_t			st_gid;
85
86	unsigned int		st_rdev;
87	unsigned int		st_pad2[3]; // Reserved for st_rdev expansion
88
89	off_t			st_size;
90
91	// These are declared as speperate fields in the kernel. Here we use
92	// the timespec struct for consistancy with the other stat structs.
93	struct timespec		st_atim;
94	struct timespec		st_mtim;
95	struct timespec		st_ctim;
96
97	unsigned int		st_blksize;
98	unsigned int		st_pad4;
99
100	long			st_blocks;
101};
102
103// These are needed because we do not include fcntl.h or sys/types.h
104#include <linux/fcntl.h>
105#include <linux/fadvise.h>
106
107#else
108
109// Use the stat defined by glibc
110#include <fcntl.h>
111#include <sys/types.h>
112
113#endif
114
115// Certain constants and structs are missing from the fs/crypto UAPI
116#define FS_MAX_KEY_SIZE                 64
117struct fscrypt_key {
118  __u32 mode;
119  __u8 raw[FS_MAX_KEY_SIZE];
120  __u32 size;
121};
122
123#ifdef TCSETS2
124// On systems that have "struct termios2" use this as type Termios.
125typedef struct termios2 termios_t;
126#else
127typedef struct termios termios_t;
128#endif
129
130enum {
131	sizeofPtr = sizeof(void*),
132};
133
134union sockaddr_all {
135	struct sockaddr s1;	// this one gets used for fields
136	struct sockaddr_in s2;	// these pad it out
137	struct sockaddr_in6 s3;
138	struct sockaddr_un s4;
139	struct sockaddr_ll s5;
140	struct sockaddr_nl s6;
141};
142
143struct sockaddr_any {
144	struct sockaddr addr;
145	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
146};
147
148// copied from /usr/include/bluetooth/hci.h
149struct sockaddr_hci {
150        sa_family_t     hci_family;
151        unsigned short  hci_dev;
152        unsigned short  hci_channel;
153};;
154
155// copied from /usr/include/linux/un.h
156struct my_sockaddr_un {
157	sa_family_t sun_family;
158#if defined(__ARM_EABI__) || defined(__powerpc64__)
159	// on ARM char is by default unsigned
160	signed char sun_path[108];
161#else
162	char sun_path[108];
163#endif
164};
165
166#ifdef __ARM_EABI__
167typedef struct user_regs PtraceRegs;
168#elif defined(__aarch64__)
169typedef struct user_pt_regs PtraceRegs;
170#elif defined(__mips__) || defined(__powerpc64__)
171typedef struct pt_regs PtraceRegs;
172#elif defined(__s390x__)
173typedef struct _user_regs_struct PtraceRegs;
174#elif defined(__sparc__)
175#include <asm/ptrace.h>
176typedef struct pt_regs PtraceRegs;
177#else
178typedef struct user_regs_struct PtraceRegs;
179#endif
180
181#if defined(__s390x__)
182typedef struct _user_psw_struct ptracePsw;
183typedef struct _user_fpregs_struct ptraceFpregs;
184typedef struct _user_per_struct ptracePer;
185#else
186typedef struct {} ptracePsw;
187typedef struct {} ptraceFpregs;
188typedef struct {} ptracePer;
189#endif
190
191// The real epoll_event is a union, and godefs doesn't handle it well.
192struct my_epoll_event {
193	uint32_t events;
194#if defined(__ARM_EABI__) || defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABIO32)
195	// padding is not specified in linux/eventpoll.h but added to conform to the
196	// alignment requirements of EABI
197	int32_t padFd;
198#elif defined(__powerpc64__) || defined(__s390x__) || defined(__sparc__)
199	int32_t _padFd;
200#endif
201	int32_t fd;
202	int32_t pad;
203};
204
205*/
206import "C"
207
208// Machine characteristics; for internal use.
209
210const (
211	sizeofPtr      = C.sizeofPtr
212	sizeofShort    = C.sizeof_short
213	sizeofInt      = C.sizeof_int
214	sizeofLong     = C.sizeof_long
215	sizeofLongLong = C.sizeof_longlong
216	PathMax        = C.PATH_MAX
217)
218
219// Basic types
220
221type (
222	_C_short     C.short
223	_C_int       C.int
224	_C_long      C.long
225	_C_long_long C.longlong
226)
227
228// Time
229
230type Timespec C.struct_timespec
231
232type Timeval C.struct_timeval
233
234type Timex C.struct_timex
235
236type Time_t C.time_t
237
238type Tms C.struct_tms
239
240type Utimbuf C.struct_utimbuf
241
242// Processes
243
244type Rusage C.struct_rusage
245
246type Rlimit C.struct_rlimit
247
248type _Gid_t C.gid_t
249
250// Files
251
252type Stat_t C.struct_stat
253
254type Statfs_t C.struct_statfs
255
256type Dirent C.struct_dirent
257
258type Fsid C.fsid_t
259
260type Flock_t C.struct_flock
261
262// Filesystem Encryption
263
264type FscryptPolicy C.struct_fscrypt_policy
265
266type FscryptKey C.struct_fscrypt_key
267
268// Structure for Keyctl
269
270type KeyctlDHParams C.struct_keyctl_dh_params
271
272// Advice to Fadvise
273
274const (
275	FADV_NORMAL     = C.POSIX_FADV_NORMAL
276	FADV_RANDOM     = C.POSIX_FADV_RANDOM
277	FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL
278	FADV_WILLNEED   = C.POSIX_FADV_WILLNEED
279	FADV_DONTNEED   = C.POSIX_FADV_DONTNEED
280	FADV_NOREUSE    = C.POSIX_FADV_NOREUSE
281)
282
283// Sockets
284
285type RawSockaddrInet4 C.struct_sockaddr_in
286
287type RawSockaddrInet6 C.struct_sockaddr_in6
288
289type RawSockaddrUnix C.struct_my_sockaddr_un
290
291type RawSockaddrLinklayer C.struct_sockaddr_ll
292
293type RawSockaddrNetlink C.struct_sockaddr_nl
294
295type RawSockaddrHCI C.struct_sockaddr_hci
296
297type RawSockaddrCAN C.struct_sockaddr_can
298
299type RawSockaddrALG C.struct_sockaddr_alg
300
301type RawSockaddrVM C.struct_sockaddr_vm
302
303type RawSockaddr C.struct_sockaddr
304
305type RawSockaddrAny C.struct_sockaddr_any
306
307type _Socklen C.socklen_t
308
309type Linger C.struct_linger
310
311type Iovec C.struct_iovec
312
313type IPMreq C.struct_ip_mreq
314
315type IPMreqn C.struct_ip_mreqn
316
317type IPv6Mreq C.struct_ipv6_mreq
318
319type PacketMreq C.struct_packet_mreq
320
321type Msghdr C.struct_msghdr
322
323type Cmsghdr C.struct_cmsghdr
324
325type Inet4Pktinfo C.struct_in_pktinfo
326
327type Inet6Pktinfo C.struct_in6_pktinfo
328
329type IPv6MTUInfo C.struct_ip6_mtuinfo
330
331type ICMPv6Filter C.struct_icmp6_filter
332
333type Ucred C.struct_ucred
334
335type TCPInfo C.struct_tcp_info
336
337const (
338	SizeofSockaddrInet4     = C.sizeof_struct_sockaddr_in
339	SizeofSockaddrInet6     = C.sizeof_struct_sockaddr_in6
340	SizeofSockaddrAny       = C.sizeof_struct_sockaddr_any
341	SizeofSockaddrUnix      = C.sizeof_struct_sockaddr_un
342	SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll
343	SizeofSockaddrNetlink   = C.sizeof_struct_sockaddr_nl
344	SizeofSockaddrHCI       = C.sizeof_struct_sockaddr_hci
345	SizeofSockaddrCAN       = C.sizeof_struct_sockaddr_can
346	SizeofSockaddrALG       = C.sizeof_struct_sockaddr_alg
347	SizeofSockaddrVM        = C.sizeof_struct_sockaddr_vm
348	SizeofLinger            = C.sizeof_struct_linger
349	SizeofIovec             = C.sizeof_struct_iovec
350	SizeofIPMreq            = C.sizeof_struct_ip_mreq
351	SizeofIPMreqn           = C.sizeof_struct_ip_mreqn
352	SizeofIPv6Mreq          = C.sizeof_struct_ipv6_mreq
353	SizeofPacketMreq        = C.sizeof_struct_packet_mreq
354	SizeofMsghdr            = C.sizeof_struct_msghdr
355	SizeofCmsghdr           = C.sizeof_struct_cmsghdr
356	SizeofInet4Pktinfo      = C.sizeof_struct_in_pktinfo
357	SizeofInet6Pktinfo      = C.sizeof_struct_in6_pktinfo
358	SizeofIPv6MTUInfo       = C.sizeof_struct_ip6_mtuinfo
359	SizeofICMPv6Filter      = C.sizeof_struct_icmp6_filter
360	SizeofUcred             = C.sizeof_struct_ucred
361	SizeofTCPInfo           = C.sizeof_struct_tcp_info
362)
363
364// Netlink routing and interface messages
365
366const (
367	IFA_UNSPEC          = C.IFA_UNSPEC
368	IFA_ADDRESS         = C.IFA_ADDRESS
369	IFA_LOCAL           = C.IFA_LOCAL
370	IFA_LABEL           = C.IFA_LABEL
371	IFA_BROADCAST       = C.IFA_BROADCAST
372	IFA_ANYCAST         = C.IFA_ANYCAST
373	IFA_CACHEINFO       = C.IFA_CACHEINFO
374	IFA_MULTICAST       = C.IFA_MULTICAST
375	IFLA_UNSPEC         = C.IFLA_UNSPEC
376	IFLA_ADDRESS        = C.IFLA_ADDRESS
377	IFLA_BROADCAST      = C.IFLA_BROADCAST
378	IFLA_IFNAME         = C.IFLA_IFNAME
379	IFLA_MTU            = C.IFLA_MTU
380	IFLA_LINK           = C.IFLA_LINK
381	IFLA_QDISC          = C.IFLA_QDISC
382	IFLA_STATS          = C.IFLA_STATS
383	IFLA_COST           = C.IFLA_COST
384	IFLA_PRIORITY       = C.IFLA_PRIORITY
385	IFLA_MASTER         = C.IFLA_MASTER
386	IFLA_WIRELESS       = C.IFLA_WIRELESS
387	IFLA_PROTINFO       = C.IFLA_PROTINFO
388	IFLA_TXQLEN         = C.IFLA_TXQLEN
389	IFLA_MAP            = C.IFLA_MAP
390	IFLA_WEIGHT         = C.IFLA_WEIGHT
391	IFLA_OPERSTATE      = C.IFLA_OPERSTATE
392	IFLA_LINKMODE       = C.IFLA_LINKMODE
393	IFLA_LINKINFO       = C.IFLA_LINKINFO
394	IFLA_NET_NS_PID     = C.IFLA_NET_NS_PID
395	IFLA_IFALIAS        = C.IFLA_IFALIAS
396	IFLA_MAX            = C.IFLA_MAX
397	RT_SCOPE_UNIVERSE   = C.RT_SCOPE_UNIVERSE
398	RT_SCOPE_SITE       = C.RT_SCOPE_SITE
399	RT_SCOPE_LINK       = C.RT_SCOPE_LINK
400	RT_SCOPE_HOST       = C.RT_SCOPE_HOST
401	RT_SCOPE_NOWHERE    = C.RT_SCOPE_NOWHERE
402	RT_TABLE_UNSPEC     = C.RT_TABLE_UNSPEC
403	RT_TABLE_COMPAT     = C.RT_TABLE_COMPAT
404	RT_TABLE_DEFAULT    = C.RT_TABLE_DEFAULT
405	RT_TABLE_MAIN       = C.RT_TABLE_MAIN
406	RT_TABLE_LOCAL      = C.RT_TABLE_LOCAL
407	RT_TABLE_MAX        = C.RT_TABLE_MAX
408	RTA_UNSPEC          = C.RTA_UNSPEC
409	RTA_DST             = C.RTA_DST
410	RTA_SRC             = C.RTA_SRC
411	RTA_IIF             = C.RTA_IIF
412	RTA_OIF             = C.RTA_OIF
413	RTA_GATEWAY         = C.RTA_GATEWAY
414	RTA_PRIORITY        = C.RTA_PRIORITY
415	RTA_PREFSRC         = C.RTA_PREFSRC
416	RTA_METRICS         = C.RTA_METRICS
417	RTA_MULTIPATH       = C.RTA_MULTIPATH
418	RTA_FLOW            = C.RTA_FLOW
419	RTA_CACHEINFO       = C.RTA_CACHEINFO
420	RTA_TABLE           = C.RTA_TABLE
421	RTN_UNSPEC          = C.RTN_UNSPEC
422	RTN_UNICAST         = C.RTN_UNICAST
423	RTN_LOCAL           = C.RTN_LOCAL
424	RTN_BROADCAST       = C.RTN_BROADCAST
425	RTN_ANYCAST         = C.RTN_ANYCAST
426	RTN_MULTICAST       = C.RTN_MULTICAST
427	RTN_BLACKHOLE       = C.RTN_BLACKHOLE
428	RTN_UNREACHABLE     = C.RTN_UNREACHABLE
429	RTN_PROHIBIT        = C.RTN_PROHIBIT
430	RTN_THROW           = C.RTN_THROW
431	RTN_NAT             = C.RTN_NAT
432	RTN_XRESOLVE        = C.RTN_XRESOLVE
433	RTNLGRP_NONE        = C.RTNLGRP_NONE
434	RTNLGRP_LINK        = C.RTNLGRP_LINK
435	RTNLGRP_NOTIFY      = C.RTNLGRP_NOTIFY
436	RTNLGRP_NEIGH       = C.RTNLGRP_NEIGH
437	RTNLGRP_TC          = C.RTNLGRP_TC
438	RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR
439	RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE
440	RTNLGRP_IPV4_ROUTE  = C.RTNLGRP_IPV4_ROUTE
441	RTNLGRP_IPV4_RULE   = C.RTNLGRP_IPV4_RULE
442	RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR
443	RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE
444	RTNLGRP_IPV6_ROUTE  = C.RTNLGRP_IPV6_ROUTE
445	RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO
446	RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX
447	RTNLGRP_IPV6_RULE   = C.RTNLGRP_IPV6_RULE
448	RTNLGRP_ND_USEROPT  = C.RTNLGRP_ND_USEROPT
449	SizeofNlMsghdr      = C.sizeof_struct_nlmsghdr
450	SizeofNlMsgerr      = C.sizeof_struct_nlmsgerr
451	SizeofRtGenmsg      = C.sizeof_struct_rtgenmsg
452	SizeofNlAttr        = C.sizeof_struct_nlattr
453	SizeofRtAttr        = C.sizeof_struct_rtattr
454	SizeofIfInfomsg     = C.sizeof_struct_ifinfomsg
455	SizeofIfAddrmsg     = C.sizeof_struct_ifaddrmsg
456	SizeofRtMsg         = C.sizeof_struct_rtmsg
457	SizeofRtNexthop     = C.sizeof_struct_rtnexthop
458)
459
460type NlMsghdr C.struct_nlmsghdr
461
462type NlMsgerr C.struct_nlmsgerr
463
464type RtGenmsg C.struct_rtgenmsg
465
466type NlAttr C.struct_nlattr
467
468type RtAttr C.struct_rtattr
469
470type IfInfomsg C.struct_ifinfomsg
471
472type IfAddrmsg C.struct_ifaddrmsg
473
474type RtMsg C.struct_rtmsg
475
476type RtNexthop C.struct_rtnexthop
477
478// Linux socket filter
479
480const (
481	SizeofSockFilter = C.sizeof_struct_sock_filter
482	SizeofSockFprog  = C.sizeof_struct_sock_fprog
483)
484
485type SockFilter C.struct_sock_filter
486
487type SockFprog C.struct_sock_fprog
488
489// Inotify
490
491type InotifyEvent C.struct_inotify_event
492
493const SizeofInotifyEvent = C.sizeof_struct_inotify_event
494
495// Ptrace
496
497// Register structures
498type PtraceRegs C.PtraceRegs
499
500// Structures contained in PtraceRegs on s390x (exported by mkpost.go)
501type PtracePsw C.ptracePsw
502
503type PtraceFpregs C.ptraceFpregs
504
505type PtracePer C.ptracePer
506
507// Misc
508
509type FdSet C.fd_set
510
511type Sysinfo_t C.struct_sysinfo
512
513type Utsname C.struct_utsname
514
515type Ustat_t C.struct_ustat
516
517type EpollEvent C.struct_my_epoll_event
518
519const (
520	AT_FDCWD            = C.AT_FDCWD
521	AT_REMOVEDIR        = C.AT_REMOVEDIR
522	AT_SYMLINK_FOLLOW   = C.AT_SYMLINK_FOLLOW
523	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
524)
525
526type PollFd C.struct_pollfd
527
528const (
529	POLLIN    = C.POLLIN
530	POLLPRI   = C.POLLPRI
531	POLLOUT   = C.POLLOUT
532	POLLRDHUP = C.POLLRDHUP
533	POLLERR   = C.POLLERR
534	POLLHUP   = C.POLLHUP
535	POLLNVAL  = C.POLLNVAL
536)
537
538type Sigset_t C.sigset_t
539
540const RNDGETENTCNT = C.RNDGETENTCNT
541
542const PERF_IOC_FLAG_GROUP = C.PERF_IOC_FLAG_GROUP
543
544// sysconf information
545
546const _SC_PAGESIZE = C._SC_PAGESIZE
547
548// Terminal handling
549
550type Termios C.termios_t
551
552type Winsize C.struct_winsize
553