github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/strace/internal/abi/abi_unix.go (about)

     1  // Copyright 2018 Google LLC.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package abi
    16  
    17  import (
    18  	"fmt"
    19  	"syscall"
    20  
    21  	"golang.org/x/sys/unix"
    22  )
    23  
    24  // OpenMode represents the mode to open(2) a file.
    25  var OpenMode = FlagSet{
    26  	&Value{
    27  		Value: syscall.O_RDWR,
    28  		Name:  "O_RDWR",
    29  	},
    30  	&Value{
    31  		Value: syscall.O_WRONLY,
    32  		Name:  "O_WRONLY",
    33  	},
    34  	&Value{
    35  		Value: syscall.O_RDONLY,
    36  		Name:  "O_RDONLY",
    37  	},
    38  }
    39  
    40  // OpenFlagSet is the set of open(2) flags.
    41  var OpenFlagSet = FlagSet{
    42  	&BitFlag{
    43  		Value: syscall.O_APPEND,
    44  		Name:  "O_APPEND",
    45  	},
    46  	&BitFlag{
    47  		Value: syscall.O_ASYNC,
    48  		Name:  "O_ASYNC",
    49  	},
    50  	&BitFlag{
    51  		Value: syscall.O_CLOEXEC,
    52  		Name:  "O_CLOEXEC",
    53  	},
    54  	&BitFlag{
    55  		Value: syscall.O_CREAT,
    56  		Name:  "O_CREAT",
    57  	},
    58  	&BitFlag{
    59  		Value: syscall.O_DIRECT,
    60  		Name:  "O_DIRECT",
    61  	},
    62  	&BitFlag{
    63  		Value: syscall.O_DIRECTORY,
    64  		Name:  "O_DIRECTORY",
    65  	},
    66  	&BitFlag{
    67  		Value: syscall.O_EXCL,
    68  		Name:  "O_EXCL",
    69  	},
    70  	&BitFlag{
    71  		Value: syscall.O_NOATIME,
    72  		Name:  "O_NOATIME",
    73  	},
    74  	&BitFlag{
    75  		Value: syscall.O_NOCTTY,
    76  		Name:  "O_NOCTTY",
    77  	},
    78  	&BitFlag{
    79  		Value: syscall.O_NOFOLLOW,
    80  		Name:  "O_NOFOLLOW",
    81  	},
    82  	&BitFlag{
    83  		Value: syscall.O_NONBLOCK,
    84  		Name:  "O_NONBLOCK",
    85  	},
    86  	&BitFlag{
    87  		Value: 0x200000, // O_PATH
    88  		Name:  "O_PATH",
    89  	},
    90  	&BitFlag{
    91  		Value: syscall.O_SYNC,
    92  		Name:  "O_SYNC",
    93  	},
    94  	&BitFlag{
    95  		Value: syscall.O_TRUNC,
    96  		Name:  "O_TRUNC",
    97  	},
    98  }
    99  
   100  func Open(val uint64) string {
   101  	s := OpenMode.Parse(val & syscall.O_ACCMODE)
   102  	if flags := OpenFlagSet.Parse(val &^ syscall.O_ACCMODE); flags != "" {
   103  		s += "|" + flags
   104  	}
   105  	return s
   106  }
   107  
   108  // socket
   109  
   110  // SocketFamily are the possible socket(2) families.
   111  var SocketFamily = FlagSet{
   112  	&Value{
   113  		Value: unix.AF_UNSPEC,
   114  		Name:  "AF_UNSPEC",
   115  	},
   116  	&Value{
   117  		Value: unix.AF_UNIX,
   118  		Name:  "AF_UNIX",
   119  	},
   120  	&Value{
   121  		Value: unix.AF_INET,
   122  		Name:  "AF_INET",
   123  	},
   124  	&Value{
   125  		Value: unix.AF_AX25,
   126  		Name:  "AF_AX25",
   127  	},
   128  	&Value{
   129  		Value: unix.AF_IPX,
   130  		Name:  "AF_IPX",
   131  	},
   132  	&Value{
   133  		Value: unix.AF_APPLETALK,
   134  		Name:  "AF_APPLETALK",
   135  	},
   136  	&Value{
   137  		Value: unix.AF_NETROM,
   138  		Name:  "AF_NETROM",
   139  	},
   140  	&Value{
   141  		Value: unix.AF_BRIDGE,
   142  		Name:  "AF_BRIDGE",
   143  	},
   144  	&Value{
   145  		Value: unix.AF_ATMPVC,
   146  		Name:  "AF_ATMPVC",
   147  	},
   148  	&Value{
   149  		Value: unix.AF_X25,
   150  		Name:  "AF_X25",
   151  	},
   152  	&Value{
   153  		Value: unix.AF_INET6,
   154  		Name:  "AF_INET6",
   155  	},
   156  	&Value{
   157  		Value: unix.AF_ROSE,
   158  		Name:  "AF_ROSE",
   159  	},
   160  	&Value{
   161  		Value: unix.AF_DECnet,
   162  		Name:  "AF_DECnet",
   163  	},
   164  	&Value{
   165  		Value: unix.AF_NETBEUI,
   166  		Name:  "AF_NETBEUI",
   167  	},
   168  	&Value{
   169  		Value: unix.AF_SECURITY,
   170  		Name:  "AF_SECURITY",
   171  	},
   172  	&Value{
   173  		Value: unix.AF_KEY,
   174  		Name:  "AF_KEY",
   175  	},
   176  	&Value{
   177  		Value: unix.AF_NETLINK,
   178  		Name:  "AF_NETLINK",
   179  	},
   180  	&Value{
   181  		Value: unix.AF_PACKET,
   182  		Name:  "AF_PACKET",
   183  	},
   184  	&Value{
   185  		Value: unix.AF_ASH,
   186  		Name:  "AF_ASH",
   187  	},
   188  	&Value{
   189  		Value: unix.AF_ECONET,
   190  		Name:  "AF_ECONET",
   191  	},
   192  	&Value{
   193  		Value: unix.AF_ATMSVC,
   194  		Name:  "AF_ATMSVC",
   195  	},
   196  	&Value{
   197  		Value: unix.AF_RDS,
   198  		Name:  "AF_RDS",
   199  	},
   200  	&Value{
   201  		Value: unix.AF_SNA,
   202  		Name:  "AF_SNA",
   203  	},
   204  	&Value{
   205  		Value: unix.AF_IRDA,
   206  		Name:  "AF_IRDA",
   207  	},
   208  	&Value{
   209  		Value: unix.AF_PPPOX,
   210  		Name:  "AF_PPPOX",
   211  	},
   212  	&Value{
   213  		Value: unix.AF_WANPIPE,
   214  		Name:  "AF_WANPIPE",
   215  	},
   216  	&Value{
   217  		Value: unix.AF_LLC,
   218  		Name:  "AF_LLC",
   219  	},
   220  	&Value{
   221  		Value: unix.AF_IB,
   222  		Name:  "AF_IB",
   223  	},
   224  	&Value{
   225  		Value: unix.AF_MPLS,
   226  		Name:  "AF_MPLS",
   227  	},
   228  	&Value{
   229  		Value: unix.AF_CAN,
   230  		Name:  "AF_CAN",
   231  	},
   232  	&Value{
   233  		Value: unix.AF_TIPC,
   234  		Name:  "AF_TIPC",
   235  	},
   236  	&Value{
   237  		Value: unix.AF_BLUETOOTH,
   238  		Name:  "AF_BLUETOOTH",
   239  	},
   240  	&Value{
   241  		Value: unix.AF_IUCV,
   242  		Name:  "AF_IUCV",
   243  	},
   244  	&Value{
   245  		Value: unix.AF_RXRPC,
   246  		Name:  "AF_RXRPC",
   247  	},
   248  	&Value{
   249  		Value: unix.AF_ISDN,
   250  		Name:  "AF_ISDN",
   251  	},
   252  	&Value{
   253  		Value: unix.AF_PHONET,
   254  		Name:  "AF_PHONET",
   255  	},
   256  	&Value{
   257  		Value: unix.AF_IEEE802154,
   258  		Name:  "AF_IEEE802154",
   259  	},
   260  	&Value{
   261  		Value: unix.AF_CAIF,
   262  		Name:  "AF_CAIF",
   263  	},
   264  	&Value{
   265  		Value: unix.AF_ALG,
   266  		Name:  "AF_ALG",
   267  	},
   268  	&Value{
   269  		Value: unix.AF_NFC,
   270  		Name:  "AF_NFC",
   271  	},
   272  	&Value{
   273  		Value: unix.AF_VSOCK,
   274  		Name:  "AF_VSOCK",
   275  	},
   276  }
   277  
   278  // SocketType are the possible socket(2) types.
   279  var SocketType = FlagSet{
   280  	&Value{
   281  		Value: unix.SOCK_STREAM,
   282  		Name:  "SOCK_STREAM",
   283  	},
   284  	&Value{
   285  		Value: unix.SOCK_DGRAM,
   286  		Name:  "SOCK_DGRAM",
   287  	},
   288  	&Value{
   289  		Value: unix.SOCK_RAW,
   290  		Name:  "SOCK_RAW",
   291  	},
   292  	&Value{
   293  		Value: unix.SOCK_RDM,
   294  		Name:  "SOCK_RDM",
   295  	},
   296  	&Value{
   297  		Value: unix.SOCK_SEQPACKET,
   298  		Name:  "SOCK_SEQPACKET",
   299  	},
   300  	&Value{
   301  		Value: unix.SOCK_DCCP,
   302  		Name:  "SOCK_DCCP",
   303  	},
   304  	&Value{
   305  		Value: unix.SOCK_PACKET,
   306  		Name:  "SOCK_PACKET",
   307  	},
   308  }
   309  
   310  // SocketFlagSet are the possible socket(2) flags.
   311  var SocketFlagSet = FlagSet{
   312  	&BitFlag{
   313  		Value: unix.SOCK_CLOEXEC,
   314  		Name:  "SOCK_CLOEXEC",
   315  	},
   316  	&BitFlag{
   317  		Value: unix.SOCK_NONBLOCK,
   318  		Name:  "SOCK_NONBLOCK",
   319  	},
   320  }
   321  
   322  // ipProtocol are the possible socket(2) types for INET and INET6 sockets.
   323  var ipProtocol = FlagSet{
   324  	&Value{
   325  		Value: unix.IPPROTO_IP,
   326  		Name:  "IPPROTO_IP",
   327  	},
   328  	&Value{
   329  		Value: unix.IPPROTO_ICMP,
   330  		Name:  "IPPROTO_ICMP",
   331  	},
   332  	&Value{
   333  		Value: unix.IPPROTO_IGMP,
   334  		Name:  "IPPROTO_IGMP",
   335  	},
   336  	&Value{
   337  		Value: unix.IPPROTO_IPIP,
   338  		Name:  "IPPROTO_IPIP",
   339  	},
   340  	&Value{
   341  		Value: unix.IPPROTO_TCP,
   342  		Name:  "IPPROTO_TCP",
   343  	},
   344  	&Value{
   345  		Value: unix.IPPROTO_EGP,
   346  		Name:  "IPPROTO_EGP",
   347  	},
   348  	&Value{
   349  		Value: unix.IPPROTO_PUP,
   350  		Name:  "IPPROTO_PUP",
   351  	},
   352  	&Value{
   353  		Value: unix.IPPROTO_UDP,
   354  		Name:  "IPPROTO_UDP",
   355  	},
   356  	&Value{
   357  		Value: unix.IPPROTO_IDP,
   358  		Name:  "IPPROTO_IDP",
   359  	},
   360  	&Value{
   361  		Value: unix.IPPROTO_TP,
   362  		Name:  "IPPROTO_TP",
   363  	},
   364  	&Value{
   365  		Value: unix.IPPROTO_DCCP,
   366  		Name:  "IPPROTO_DCCP",
   367  	},
   368  	&Value{
   369  		Value: unix.IPPROTO_IPV6,
   370  		Name:  "IPPROTO_IPV6",
   371  	},
   372  	&Value{
   373  		Value: unix.IPPROTO_RSVP,
   374  		Name:  "IPPROTO_RSVP",
   375  	},
   376  	&Value{
   377  		Value: unix.IPPROTO_GRE,
   378  		Name:  "IPPROTO_GRE",
   379  	},
   380  	&Value{
   381  		Value: unix.IPPROTO_ESP,
   382  		Name:  "IPPROTO_ESP",
   383  	},
   384  	&Value{
   385  		Value: unix.IPPROTO_AH,
   386  		Name:  "IPPROTO_AH",
   387  	},
   388  	&Value{
   389  		Value: unix.IPPROTO_MTP,
   390  		Name:  "IPPROTO_MTP",
   391  	},
   392  	&Value{
   393  		Value: unix.IPPROTO_BEETPH,
   394  		Name:  "IPPROTO_BEETPH",
   395  	},
   396  	&Value{
   397  		Value: unix.IPPROTO_ENCAP,
   398  		Name:  "IPPROTO_ENCAP",
   399  	},
   400  	&Value{
   401  		Value: unix.IPPROTO_PIM,
   402  		Name:  "IPPROTO_PIM",
   403  	},
   404  	&Value{
   405  		Value: unix.IPPROTO_COMP,
   406  		Name:  "IPPROTO_COMP",
   407  	},
   408  	&Value{
   409  		Value: unix.IPPROTO_SCTP,
   410  		Name:  "IPPROTO_SCTP",
   411  	},
   412  	&Value{
   413  		Value: unix.IPPROTO_UDPLITE,
   414  		Name:  "IPPROTO_UDPLITE",
   415  	},
   416  	&Value{
   417  		Value: unix.IPPROTO_MPLS,
   418  		Name:  "IPPROTO_MPLS",
   419  	},
   420  	&Value{
   421  		Value: unix.IPPROTO_RAW,
   422  		Name:  "IPPROTO_RAW",
   423  	},
   424  }
   425  
   426  // SocketProtocol are the possible socket(2) protocols for each protocol family.
   427  var SocketProtocol = map[int32]FlagSet{
   428  	unix.AF_INET:  ipProtocol,
   429  	unix.AF_INET6: ipProtocol,
   430  	unix.AF_NETLINK: {
   431  		&Value{
   432  			Value: unix.NETLINK_ROUTE,
   433  			Name:  "NETLINK_ROUTE",
   434  		},
   435  		&Value{
   436  			Value: unix.NETLINK_UNUSED,
   437  			Name:  "NETLINK_UNUSED",
   438  		},
   439  		&Value{
   440  			Value: unix.NETLINK_USERSOCK,
   441  			Name:  "NETLINK_USERSOCK",
   442  		},
   443  		&Value{
   444  			Value: unix.NETLINK_FIREWALL,
   445  			Name:  "NETLINK_FIREWALL",
   446  		},
   447  		&Value{
   448  			Value: unix.NETLINK_SOCK_DIAG,
   449  			Name:  "NETLINK_SOCK_DIAG",
   450  		},
   451  		&Value{
   452  			Value: unix.NETLINK_NFLOG,
   453  			Name:  "NETLINK_NFLOG",
   454  		},
   455  		&Value{
   456  			Value: unix.NETLINK_XFRM,
   457  			Name:  "NETLINK_XFRM",
   458  		},
   459  		&Value{
   460  			Value: unix.NETLINK_SELINUX,
   461  			Name:  "NETLINK_SELINUX",
   462  		},
   463  		&Value{
   464  			Value: unix.NETLINK_ISCSI,
   465  			Name:  "NETLINK_ISCSI",
   466  		},
   467  		&Value{
   468  			Value: unix.NETLINK_AUDIT,
   469  			Name:  "NETLINK_AUDIT",
   470  		},
   471  		&Value{
   472  			Value: unix.NETLINK_FIB_LOOKUP,
   473  			Name:  "NETLINK_FIB_LOOKUP",
   474  		},
   475  		&Value{
   476  			Value: unix.NETLINK_CONNECTOR,
   477  			Name:  "NETLINK_CONNECTOR",
   478  		},
   479  		&Value{
   480  			Value: unix.NETLINK_NETFILTER,
   481  			Name:  "NETLINK_NETFILTER",
   482  		},
   483  		&Value{
   484  			Value: unix.NETLINK_IP6_FW,
   485  			Name:  "NETLINK_IP6_FW",
   486  		},
   487  		&Value{
   488  			Value: unix.NETLINK_DNRTMSG,
   489  			Name:  "NETLINK_DNRTMSG",
   490  		},
   491  		&Value{
   492  			Value: unix.NETLINK_KOBJECT_UEVENT,
   493  			Name:  "NETLINK_KOBJECT_UEVENT",
   494  		},
   495  		&Value{
   496  			Value: unix.NETLINK_GENERIC,
   497  			Name:  "NETLINK_GENERIC",
   498  		},
   499  		&Value{
   500  			Value: unix.NETLINK_SCSITRANSPORT,
   501  			Name:  "NETLINK_SCSITRANSPORT",
   502  		},
   503  		&Value{
   504  			Value: unix.NETLINK_ECRYPTFS,
   505  			Name:  "NETLINK_ECRYPTFS",
   506  		},
   507  		&Value{
   508  			Value: unix.NETLINK_RDMA,
   509  			Name:  "NETLINK_RDMA",
   510  		},
   511  		&Value{
   512  			Value: unix.NETLINK_CRYPTO,
   513  			Name:  "NETLINK_CRYPTO",
   514  		},
   515  	},
   516  }
   517  
   518  var ControlMessageType = map[int32]string{
   519  	unix.SCM_RIGHTS:      "SCM_RIGHTS",
   520  	unix.SCM_CREDENTIALS: "SCM_CREDENTIALS",
   521  	unix.SO_TIMESTAMP:    "SO_TIMESTAMP",
   522  }
   523  
   524  func SockType(stype int32) string {
   525  	s := SocketType.Parse(uint64(stype & SOCK_TYPE_MASK))
   526  	if flags := SocketFlagSet.Parse(uint64(stype &^ SOCK_TYPE_MASK)); flags != "" {
   527  		s += "|" + flags
   528  	}
   529  	return s
   530  }
   531  
   532  func SockProtocol(family, protocol int32) string {
   533  	protocols, ok := SocketProtocol[family]
   534  	if !ok {
   535  		return fmt.Sprintf("%#x", protocol)
   536  	}
   537  	return protocols.Parse(uint64(protocol))
   538  }
   539  
   540  func SockFlags(flags int32) string {
   541  	if flags == 0 {
   542  		return "0"
   543  	}
   544  	return SocketFlagSet.Parse(uint64(flags))
   545  }
   546  
   547  // MessageHeader64 is the 64-bit representation of the msghdr struct used in
   548  // the recvmsg and sendmsg syscalls.
   549  type MessageHeader64 struct {
   550  	// Name is the optional pointer to a network address buffer.
   551  	Name uint64
   552  
   553  	// NameLen is the length of the buffer pointed to by Name.
   554  	NameLen uint32
   555  	_       uint32
   556  
   557  	// Iov is a pointer to an array of io vectors that describe the memory
   558  	// locations involved in the io operation.
   559  	Iov uint64
   560  
   561  	// IovLen is the length of the array pointed to by Iov.
   562  	IovLen uint64
   563  
   564  	// Control is the optional pointer to ancillary control data.
   565  	Control uint64
   566  
   567  	// ControlLen is the length of the data pointed to by Control.
   568  	ControlLen uint64
   569  
   570  	// Flags on the sent/received message.
   571  	Flags int32
   572  	_     int32
   573  }