liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
// +build ignore
 
/*
Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
*/
 
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
 
package syscall
 
/*
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
#define _GNU_SOURCE
 
#include <dirent.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netpacket/packet.h>
#include <signal.h>
#include <stdio.h>
#include <sys/epoll.h>
#include <sys/inotify.h>
#include <sys/mman.h>
#include <sys/mount.h>
#include <sys/param.h>
#include <sys/ptrace.h>
#include <sys/resource.h>
#include <sys/select.h>
#include <sys/signal.h>
#include <sys/stat.h>
#include <sys/statfs.h>
#include <sys/sysinfo.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/timex.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/user.h>
#include <sys/utsname.h>
#include <sys/wait.h>
#include <linux/filter.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/icmpv6.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>
#include <utime.h>
 
enum {
   sizeofPtr = sizeof(void*),
};
 
union sockaddr_all {
   struct sockaddr s1;    // this one gets used for fields
   struct sockaddr_in s2;    // these pad it out
   struct sockaddr_in6 s3;
   struct sockaddr_un s4;
   struct sockaddr_ll s5;
   struct sockaddr_nl s6;
};
 
struct sockaddr_any {
   struct sockaddr addr;
   char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
 
// copied from /usr/include/linux/un.h
struct my_sockaddr_un {
   sa_family_t sun_family;
#if defined(__ARM_EABI__) || defined(__powerpc64__) || defined(__s390x__)
   // on ARM, PPC and s390x char is by default unsigned
   signed char sun_path[108];
#else
   char sun_path[108];
#endif
};
 
#ifdef __ARM_EABI__
typedef struct user_regs PtraceRegs;
#elif defined(__aarch64__)
typedef struct user_pt_regs PtraceRegs;
#elif defined(__powerpc64__)
typedef struct pt_regs PtraceRegs;
#elif defined(__mips__)
typedef struct user PtraceRegs;
#elif defined(__s390x__)
typedef struct _user_regs_struct PtraceRegs;
#else
typedef struct user_regs_struct PtraceRegs;
#endif
 
#if defined(__s390x__)
typedef struct _user_psw_struct ptracePsw;
typedef struct _user_fpregs_struct ptraceFpregs;
typedef struct _user_per_struct ptracePer;
#else
typedef struct {} ptracePsw;
typedef struct {} ptraceFpregs;
typedef struct {} ptracePer;
#endif
 
// The real epoll_event is a union, and godefs doesn't handle it well.
struct my_epoll_event {
   uint32_t events;
#if defined(__ARM_EABI__) || (defined(__mips__) && _MIPS_SIM == _ABIO32)
   // padding is not specified in linux/eventpoll.h but added to conform to the
   // alignment requirements of EABI
   int32_t padFd;
#endif
#if defined(__powerpc64__) || defined(__s390x__)
   int32_t _padFd;
#endif
   int32_t fd;
   int32_t pad;
};
 
// ustat is deprecated and glibc 2.28 removed ustat.h. Provide the type here for
// backwards compatibility. Copied from /usr/include/bits/ustat.h
struct ustat {
   __daddr_t f_tfree;
   __ino_t f_tinode;
   char f_fname[6];
   char f_fpack[6];
};
 
*/
import "C"
 
// Machine characteristics; for internal use.
 
const (
   sizeofPtr      = C.sizeofPtr
   sizeofShort    = C.sizeof_short
   sizeofInt      = C.sizeof_int
   sizeofLong     = C.sizeof_long
   sizeofLongLong = C.sizeof_longlong
   PathMax        = C.PATH_MAX
)
 
// Basic types
 
type (
   _C_short     C.short
   _C_int       C.int
   _C_long      C.long
   _C_long_long C.longlong
)
 
// Time
 
type Timespec C.struct_timespec
 
type Timeval C.struct_timeval
 
type Timex C.struct_timex
 
type Time_t C.time_t
 
type Tms C.struct_tms
 
type Utimbuf C.struct_utimbuf
 
// Processes
 
type Rusage C.struct_rusage
 
type Rlimit C.struct_rlimit
 
type _Gid_t C.gid_t
 
// Files
 
type Stat_t C.struct_stat
 
type Statfs_t C.struct_statfs
 
type Dirent C.struct_dirent
 
type Fsid C.fsid_t
 
type Flock_t C.struct_flock
 
// Sockets
 
type RawSockaddrInet4 C.struct_sockaddr_in
 
type RawSockaddrInet6 C.struct_sockaddr_in6
 
type RawSockaddrUnix C.struct_my_sockaddr_un
 
type RawSockaddrLinklayer C.struct_sockaddr_ll
 
type RawSockaddrNetlink C.struct_sockaddr_nl
 
type RawSockaddr C.struct_sockaddr
 
type RawSockaddrAny C.struct_sockaddr_any
 
type _Socklen C.socklen_t
 
type Linger C.struct_linger
 
type Iovec C.struct_iovec
 
type IPMreq C.struct_ip_mreq
 
type IPMreqn C.struct_ip_mreqn
 
type IPv6Mreq C.struct_ipv6_mreq
 
type Msghdr C.struct_msghdr
 
type Cmsghdr C.struct_cmsghdr
 
type Inet4Pktinfo C.struct_in_pktinfo
 
type Inet6Pktinfo C.struct_in6_pktinfo
 
type IPv6MTUInfo C.struct_ip6_mtuinfo
 
type ICMPv6Filter C.struct_icmp6_filter
 
type Ucred C.struct_ucred
 
type TCPInfo C.struct_tcp_info
 
const (
   SizeofSockaddrInet4     = C.sizeof_struct_sockaddr_in
   SizeofSockaddrInet6     = C.sizeof_struct_sockaddr_in6
   SizeofSockaddrAny       = C.sizeof_struct_sockaddr_any
   SizeofSockaddrUnix      = C.sizeof_struct_sockaddr_un
   SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll
   SizeofSockaddrNetlink   = C.sizeof_struct_sockaddr_nl
   SizeofLinger            = C.sizeof_struct_linger
   SizeofIPMreq            = C.sizeof_struct_ip_mreq
   SizeofIPMreqn           = C.sizeof_struct_ip_mreqn
   SizeofIPv6Mreq          = C.sizeof_struct_ipv6_mreq
   SizeofMsghdr            = C.sizeof_struct_msghdr
   SizeofCmsghdr           = C.sizeof_struct_cmsghdr
   SizeofInet4Pktinfo      = C.sizeof_struct_in_pktinfo
   SizeofInet6Pktinfo      = C.sizeof_struct_in6_pktinfo
   SizeofIPv6MTUInfo       = C.sizeof_struct_ip6_mtuinfo
   SizeofICMPv6Filter      = C.sizeof_struct_icmp6_filter
   SizeofUcred             = C.sizeof_struct_ucred
   SizeofTCPInfo           = C.sizeof_struct_tcp_info
)
 
// Netlink routing and interface messages
 
const (
   IFA_UNSPEC          = C.IFA_UNSPEC
   IFA_ADDRESS         = C.IFA_ADDRESS
   IFA_LOCAL           = C.IFA_LOCAL
   IFA_LABEL           = C.IFA_LABEL
   IFA_BROADCAST       = C.IFA_BROADCAST
   IFA_ANYCAST         = C.IFA_ANYCAST
   IFA_CACHEINFO       = C.IFA_CACHEINFO
   IFA_MULTICAST       = C.IFA_MULTICAST
   IFLA_UNSPEC         = C.IFLA_UNSPEC
   IFLA_ADDRESS        = C.IFLA_ADDRESS
   IFLA_BROADCAST      = C.IFLA_BROADCAST
   IFLA_IFNAME         = C.IFLA_IFNAME
   IFLA_MTU            = C.IFLA_MTU
   IFLA_LINK           = C.IFLA_LINK
   IFLA_QDISC          = C.IFLA_QDISC
   IFLA_STATS          = C.IFLA_STATS
   IFLA_COST           = C.IFLA_COST
   IFLA_PRIORITY       = C.IFLA_PRIORITY
   IFLA_MASTER         = C.IFLA_MASTER
   IFLA_WIRELESS       = C.IFLA_WIRELESS
   IFLA_PROTINFO       = C.IFLA_PROTINFO
   IFLA_TXQLEN         = C.IFLA_TXQLEN
   IFLA_MAP            = C.IFLA_MAP
   IFLA_WEIGHT         = C.IFLA_WEIGHT
   IFLA_OPERSTATE      = C.IFLA_OPERSTATE
   IFLA_LINKMODE       = C.IFLA_LINKMODE
   IFLA_LINKINFO       = C.IFLA_LINKINFO
   IFLA_NET_NS_PID     = C.IFLA_NET_NS_PID
   IFLA_IFALIAS        = C.IFLA_IFALIAS
   IFLA_MAX            = C.IFLA_MAX
   RT_SCOPE_UNIVERSE   = C.RT_SCOPE_UNIVERSE
   RT_SCOPE_SITE       = C.RT_SCOPE_SITE
   RT_SCOPE_LINK       = C.RT_SCOPE_LINK
   RT_SCOPE_HOST       = C.RT_SCOPE_HOST
   RT_SCOPE_NOWHERE    = C.RT_SCOPE_NOWHERE
   RT_TABLE_UNSPEC     = C.RT_TABLE_UNSPEC
   RT_TABLE_COMPAT     = C.RT_TABLE_COMPAT
   RT_TABLE_DEFAULT    = C.RT_TABLE_DEFAULT
   RT_TABLE_MAIN       = C.RT_TABLE_MAIN
   RT_TABLE_LOCAL      = C.RT_TABLE_LOCAL
   RT_TABLE_MAX        = C.RT_TABLE_MAX
   RTA_UNSPEC          = C.RTA_UNSPEC
   RTA_DST             = C.RTA_DST
   RTA_SRC             = C.RTA_SRC
   RTA_IIF             = C.RTA_IIF
   RTA_OIF             = C.RTA_OIF
   RTA_GATEWAY         = C.RTA_GATEWAY
   RTA_PRIORITY        = C.RTA_PRIORITY
   RTA_PREFSRC         = C.RTA_PREFSRC
   RTA_METRICS         = C.RTA_METRICS
   RTA_MULTIPATH       = C.RTA_MULTIPATH
   RTA_FLOW            = C.RTA_FLOW
   RTA_CACHEINFO       = C.RTA_CACHEINFO
   RTA_TABLE           = C.RTA_TABLE
   RTN_UNSPEC          = C.RTN_UNSPEC
   RTN_UNICAST         = C.RTN_UNICAST
   RTN_LOCAL           = C.RTN_LOCAL
   RTN_BROADCAST       = C.RTN_BROADCAST
   RTN_ANYCAST         = C.RTN_ANYCAST
   RTN_MULTICAST       = C.RTN_MULTICAST
   RTN_BLACKHOLE       = C.RTN_BLACKHOLE
   RTN_UNREACHABLE     = C.RTN_UNREACHABLE
   RTN_PROHIBIT        = C.RTN_PROHIBIT
   RTN_THROW           = C.RTN_THROW
   RTN_NAT             = C.RTN_NAT
   RTN_XRESOLVE        = C.RTN_XRESOLVE
   RTNLGRP_NONE        = C.RTNLGRP_NONE
   RTNLGRP_LINK        = C.RTNLGRP_LINK
   RTNLGRP_NOTIFY      = C.RTNLGRP_NOTIFY
   RTNLGRP_NEIGH       = C.RTNLGRP_NEIGH
   RTNLGRP_TC          = C.RTNLGRP_TC
   RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR
   RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE
   RTNLGRP_IPV4_ROUTE  = C.RTNLGRP_IPV4_ROUTE
   RTNLGRP_IPV4_RULE   = C.RTNLGRP_IPV4_RULE
   RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR
   RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE
   RTNLGRP_IPV6_ROUTE  = C.RTNLGRP_IPV6_ROUTE
   RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO
   RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX
   RTNLGRP_IPV6_RULE   = C.RTNLGRP_IPV6_RULE
   RTNLGRP_ND_USEROPT  = C.RTNLGRP_ND_USEROPT
   SizeofNlMsghdr      = C.sizeof_struct_nlmsghdr
   SizeofNlMsgerr      = C.sizeof_struct_nlmsgerr
   SizeofRtGenmsg      = C.sizeof_struct_rtgenmsg
   SizeofNlAttr        = C.sizeof_struct_nlattr
   SizeofRtAttr        = C.sizeof_struct_rtattr
   SizeofIfInfomsg     = C.sizeof_struct_ifinfomsg
   SizeofIfAddrmsg     = C.sizeof_struct_ifaddrmsg
   SizeofRtMsg         = C.sizeof_struct_rtmsg
   SizeofRtNexthop     = C.sizeof_struct_rtnexthop
)
 
type NlMsghdr C.struct_nlmsghdr
 
type NlMsgerr C.struct_nlmsgerr
 
type RtGenmsg C.struct_rtgenmsg
 
type NlAttr C.struct_nlattr
 
type RtAttr C.struct_rtattr
 
type IfInfomsg C.struct_ifinfomsg
 
type IfAddrmsg C.struct_ifaddrmsg
 
type RtMsg C.struct_rtmsg
 
type RtNexthop C.struct_rtnexthop
 
// Linux socket filter
 
const (
   SizeofSockFilter = C.sizeof_struct_sock_filter
   SizeofSockFprog  = C.sizeof_struct_sock_fprog
)
 
type SockFilter C.struct_sock_filter
 
type SockFprog C.struct_sock_fprog
 
// Inotify
 
type InotifyEvent C.struct_inotify_event
 
const SizeofInotifyEvent = C.sizeof_struct_inotify_event
 
// Ptrace
 
// Register structures
type PtraceRegs C.PtraceRegs
 
// Structures contained in PtraceRegs on s390x (exported by post.go)
type ptracePsw C.ptracePsw
 
type ptraceFpregs C.ptraceFpregs
 
type ptracePer C.ptracePer
 
// Misc
 
type FdSet C.fd_set
 
type Sysinfo_t C.struct_sysinfo
 
type Utsname C.struct_utsname
 
type Ustat_t C.struct_ustat
 
type EpollEvent C.struct_my_epoll_event
 
const (
   _AT_FDCWD            = C.AT_FDCWD
   _AT_REMOVEDIR        = C.AT_REMOVEDIR
   _AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
   _AT_EACCESS          = C.AT_EACCESS
)
 
// Terminal handling
 
type Termios C.struct_termios
 
const (
   IUCLC  = C.IUCLC
   OLCUC  = C.OLCUC
   TCGETS = C.TCGETS
   TCSETS = C.TCSETS
   XCASE  = C.XCASE
)