@ GNU AS assembler header file for Socket
@ Written by DefMod (Dec  9 2012) on Sun Dec  9 15:44:51 2012
@ Jonathan Coxhead, jonathan@doves.demon.co.uk, 22 Aug 1995

@ OSLib---efficient, type-safe, transparent, extensible,
@ register-safe API coverage of RISC OS
@ 
@ Copyright (c) 1994-2012 Jonathan Coxhead and OSLib maintainers
@ 
@ Licence:
@ 
@    OSLib is free software; you can redistribute it and/or modify
@ it under the terms of the GNU General Public License as published by
@ the Free Software Foundation; either version 1, or (at your option)
@ any later version - and this with the following clarification and
@ special exception:
@ 
@    Linking this library statically or dynamically with other modules
@ is making a combined work based on this library. Thus, the terms
@ and conditions of the GNU General Public License cover the whole
@ combination.
@ 
@    As a special exception, the copyright holders of this library
@ give you permission to link this library with independent modules
@ to produce an executable, regardless of the license terms of these
@ independent modules, and to copy and distribute the resulting
@ executable under terms of your choice, provided that you also meet,
@ for each linked independent module, the terms and conditions of the
@ license of that module. An independent module is a module which is
@ not derived from or based on this library. If you modify this
@ library, you may extend this exception to your version of the library,
@ but you are not obliged to do so. If you do not wish to do so, delete
@ this exception statement from your version.
@ 
@    OSLib is distributed in the hope that it will be useful,
@ but WITHOUT ANY WARRANTY; without even the implied warranty of
@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@ GNU General Public License for more details.
@ 
@    You should have received a copy of the GNU General Public License
@ along with this programme; if not, write to the Free Software
@ Foundation, Inc, 675 Mass Ave, Cambridge, MA 02139, USA.

#ifndef Socket_Hdr
#  define Socket_Hdr

#  ifndef Get_Types
#    define Get_Types
#    include "oslib/Types.Hdr"
#  endif

#  ifndef Get_OS
#    define Get_OS
#    include "oslib/OS.Hdr"
#  endif

@Symbols for constants
#  define Socket_AFInet 0x2
#  define Socket_SockStream 0x1
#  define Socket_SockDGram 0x2
#  define Socket_SockRaw 0x3
#  define Socket_IpprotoIP 0x0
#  define Socket_IpprotoICMP 0x1
#  define Socket_IpprotoTCP 0x6
#  define Socket_IpprotoUDP 0x11
#  define Socket_IpprotoRaw 0xff
#  define Socket_SolSocket 0xffff
#  define Socket_EBadf 0x9
#  define Socket_EAgain 0xb
#  define Socket_EFault 0xe
#  define Socket_EInval 0x16
#  define Socket_EWouldblock 0x23
#  define Socket_EInprogress 0x24
#  define Socket_EAlready 0x25
#  define Socket_ENotsock 0x26
#  define Socket_EDestaddrreq 0x27
#  define Socket_EMsgsize 0x28
#  define Socket_EPrototype 0x29
#  define Socket_ENoprotoopt 0x2a
#  define Socket_EProtonosupport 0x2b
#  define Socket_ESocktnosupport 0x2c
#  define Socket_EOpnotsupp 0x2d
#  define Socket_EPfnosupport 0x2e
#  define Socket_EAfnosupport 0x2f
#  define Socket_EAddrinuse 0x30
#  define Socket_EAddrnotavail 0x31
#  define Socket_ENetdown 0x32
#  define Socket_ENetunreach 0x33
#  define Socket_ENetreset 0x34
#  define Socket_EConnaborted 0x35
#  define Socket_EConnreset 0x36
#  define Socket_ENobufs 0x37
#  define Socket_EIsconn 0x38
#  define Socket_ENotconn 0x39
#  define Socket_EShutdown 0x3a
#  define Socket_EToomanyrefs 0x3b
#  define Socket_ETimedout 0x3c
#  define Socket_EConnrefused 0x3d
#  define Socket_EHostdown 0x40
#  define Socket_EHostunreach 0x41
#  define Socket_SoAcceptconn 0x2
#  define Socket_SoReuseaddr 0x4
#  define Socket_SoKeepalive 0x8
#  define Socket_SoDontroute 0x10
#  define Socket_SoBroadcast 0x20
#  define Socket_SoUseloopback 0x40
#  define Socket_SoLinger 0x80
#  define Socket_SoOobinline 0x100
#  define Socket_SoSndbuf 0x1001
#  define Socket_SoRcvbuf 0x1002
#  define Socket_SoSndlowat 0x1003
#  define Socket_SoRcvlowat 0x1004
#  define Socket_SoSndtimeo 0x1005
#  define Socket_SoRcvtimeo 0x1006
#  define Socket_SoError 0x1007
#  define Socket_SoType 0x1008
#  define Socket_IFNameLimit 0x10
#  define Socket_IFUp 0x1
#  define Socket_IFBroadcast 0x2
#  define Socket_IFDebug 0x4
#  define Socket_IFLoopback 0x8
#  define Socket_IFPointToPoint 0x10
#  define Socket_IFNoTrailers 0x20
#  define Socket_IFRunning 0x40
#  define Socket_IFNoARP 0x80
#  define Socket_SIOCSHIWAT 0x80047300
#  define Socket_SIOCGHIWAT 0x40047301
#  define Socket_SIOCSLOWAT 0x80047302
#  define Socket_SIOCGLOWAT 0x40047303
#  define Socket_SIOCATMARK 0x40047307
#  define Socket_SIOCSIFADDR 0x8020690c
#  define Socket_SIOCGIFADDR 0xc020690d
#  define Socket_SIOCSIFDSTADDR 0x8020690e
#  define Socket_SIOCGIFDSTADDR 0xc020690f
#  define Socket_SIOCSIFFLAGS 0x80206910
#  define Socket_SIOCGIFFLAGS 0xc0206911
#  define Socket_SIOCGIFBRDADDR 0xc0206912
#  define Socket_SIOCSIFBRDADDR 0x80206913
#  define Socket_SIOCGIFCONF 0xc0086914
#  define Socket_SIOCGIFNETMASK 0xc0206915
#  define Socket_SIOCSIFNETMASK 0x80206916
#  define Socket_SIOCGIFMETRIC 0xc0206917
#  define Socket_SIOCSIFMETRIC 0x80206918
#  define Socket_FIOSLEEPTW 0x80046679
#  define Socket_FIONREAD 0x4004667f
#  define Socket_FIONBIO 0x8004667e
#  define Socket_FIOASYNC 0x8004667d
#  define Socket_FIOPOLLWORD 0x80086678
#  define Socket_MsgOob 0x1
#  define Socket_MsgPeek 0x2
#  define Socket_MsgDontroute 0x4
#  define Socket_ShutdownRecv 0x0
#  define Socket_ShutdownSend 0x1
#  define Socket_ShutdownAll 0x2
#  define Socket_AsyncEvent 0x1
#  define Socket_UrgentEvent 0x2
#  define Socket_BrokenEvent 0x3

@Symbols for structure offsets and sizes
        .struct 0
        .skip   Short
Socket_AF                      : 

        .struct 0
        .skip   Int
Socket_Sock                    : 

        .struct 0
        .skip   Int
Socket_Ipproto                 : 

        .struct 0
        .skip   Int
Socket_Level                   : 

        .struct 0
Socket_SockaddrIn_af           : .skip   Socket_AF
Socket_SockaddrIn_port         : .skip   Short
Socket_SockaddrIn_addr         : .skip   Bits
Socket_SockaddrIn_data         : .skip   8*Byte
Socket_SockaddrIn              : 

        .struct 0
Socket_Sockaddr_sockaddr_af    : .skip   Socket_AF
Socket_Sockaddr_sockaddr_data  : .skip   14*Byte
        .struct 0
Socket_Sockaddr_sockaddr_in    : .skip   Socket_SockaddrIn
Socket_Sockaddr                : 

        .struct 0
Socket_Linger_onoff            : .skip   Int
Socket_Linger_linger           : .skip   Int
Socket_Linger                  : 

        .struct 0
Socket_Timeval_sec             : .skip   Int
Socket_Timeval_usec            : .skip   Int
Socket_Timeval                 : 

        .struct 0
        .skip   Int
Socket_So                      : 

        .struct 0
        .skip   Short
Socket_IFFlags                 : 

        .struct 0
Socket_Ifreq_name              : .skip   16*Char
Socket_Ifreq_u                 : 
Socket_Ifreq_u_sockaddr        : .skip   Socket_Sockaddr
        .struct Socket_Ifreq_u
Socket_Ifreq_u_broadaddr       : .skip   Socket_Sockaddr
        .struct Socket_Ifreq_u
Socket_Ifreq_u_flags           : .skip   Socket_IFFlags
        .struct Socket_Ifreq_u
Socket_Ifreq_u_metric          : .skip   Int
        .struct Socket_Ifreq_u
Socket_Ifreq_u_data            : .skip   Ptr
        .struct Socket_Ifreq_u
Socket_Ifreq_u_reserved        : .skip   16*Byte
Socket_Ifreq                   : 

        .struct 0
Socket_Ifconf_len              : .skip   Int
Socket_Ifconf_u                : 
Socket_Ifconf_u_buf            : .skip   Ptr
        .struct Socket_Ifconf_u
Socket_Ifconf_u_req            : .skip   Ptr
Socket_Ifconf                  : 

        .struct 0
Socket_Pwstruct_pollword       : .skip   Ptr
Socket_Pwstruct_bit_number     : .skip   Int
Socket_Pwstruct                : 

        .struct 0
        .skip   Bits
Socket_IoctlNo                 : 

        .struct 0
        .skip   Bits
Socket_MsgFlags                : 

@ abstract type
#  define Socket_S 4

        .struct 0
Socket_Iovec_base              : .skip   Ptr
Socket_Iovec_len               : .skip   Int
Socket_Iovec                   : 

        .struct 0
Socket_Msghdr_name             : .skip   Ptr
Socket_Msghdr_namelen          : .skip   Int
Socket_Msghdr_iov              : .skip   Ptr
Socket_Msghdr_iov_count        : .skip   Int
Socket_Msghdr_accrights        : .skip   Ptr
Socket_Msghdr_accrightslen     : .skip   Int
Socket_Msghdr                  : 

        .struct 0
        .skip   Int
Socket_ShutdownType            : 

Socket_Fdset                   : 

        .struct 0
        .skip   Int
Socket_EventType               : 


@Symbols for SWI's and SWI reason codes
.set XSocket_Creat,0x61200
.set Socket_Creat,0x41200
   @Entry
   @  R0 = af (Socket_AF)
   @  R1 = sock (Socket_Sock)
   @  R2 = proto (Socket_Ipproto)
   @Exit
   @  R0 = s (Socket_S)

.set XSocket_Bind,0x61201
.set Socket_Bind,0x41201
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> sockaddr (Socket_Sockaddr)
   @  R2 = namelen (Int)

.set XSocket_Listen,0x61202
.set Socket_Listen,0x41202
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = backlog (Int)

.set XSocket_Accept,0x61203
.set Socket_Accept,0x41203
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = sockaddr (pointer to Socket_Sockaddr)
   @  R2 = addrlen (pointer to Int)
   @Exit
   @  R0 = ns (Socket_S)

.set XSocket_Connect,0x61204
.set Socket_Connect,0x41204
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = sockaddr (pointer to Socket_Sockaddr)
   @  R2 = namelen (Int)

.set XSocket_Recv,0x61205
.set Socket_Recv,0x41205
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = buf (pointer to data)
   @  R2 = len (Int)
   @  R3 = flags (Socket_MsgFlags)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Recvfrom,0x61206
.set Socket_Recvfrom,0x41206
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = buf (pointer to data)
   @  R2 = len (Int)
   @  R3 = flags (Socket_MsgFlags)
   @  R4 = from (pointer to Socket_Sockaddr)
   @  R5 = fromlen (pointer to Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Recvmsg,0x61207
.set Socket_Recvmsg,0x41207
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = msg (pointer to Socket_Msghdr)
   @  R2 = flags (Socket_MsgFlags)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Send,0x61208
.set Socket_Send,0x41208
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> msg (data)
   @  R2 = len (Int)
   @  R3 = flags (Socket_MsgFlags)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Sendto,0x61209
.set Socket_Sendto,0x41209
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> msg (data)
   @  R2 = len (Int)
   @  R3 = flags (Socket_MsgFlags)
   @  R4 -> to (Socket_Sockaddr)
   @  R5 = tolen (Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Sendmsg,0x6120a
.set Socket_Sendmsg,0x4120a
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> msg (Socket_Msghdr)
   @  R2 = flags (Socket_MsgFlags)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Shutdown,0x6120b
.set Socket_Shutdown,0x4120b
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = type (Socket_ShutdownType)

.set XSocket_Setsockopt,0x6120c
.set Socket_Setsockopt,0x4120c
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = level (Socket_Level)
   @  R2 = optname (Socket_So)
   @  R3 -> optval (data)
   @  R4 = optlen (Int)

.set XSocket_Getsockopt,0x6120d
.set Socket_Getsockopt,0x4120d
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = level (Socket_Level)
   @  R2 = optname (Socket_So)
   @  R3 = optval (pointer to data)
   @  R4 = optlen (pointer to Int)

.set XSocket_Getpeername,0x6120e
.set Socket_Getpeername,0x4120e
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = sockaddr (pointer to Socket_Sockaddr)
   @  R2 = namelen (pointer to Int)

.set XSocket_Getsockname,0x6120f
.set Socket_Getsockname,0x4120f
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = sockaddr (pointer to Socket_Sockaddr)
   @  R2 = namelen (pointer to Int)

.set XSocket_Close,0x61210
.set Socket_Close,0x41210
   @Entry
   @  R0 = s (Socket_S)

.set XSocket_Select,0x61211
.set Socket_Select,0x41211
   @Entry
   @  R0 = nfds (Int)
   @  R1 -> readfds (Socket_Fdset)
   @  R2 -> writefds (Socket_Fdset)
   @  R3 -> exceptfds (Socket_Fdset)
   @  R4 -> timeout (Socket_Timeval)
   @Exit
   @  R0 = nfound (Int)

.set XSocket_Ioctl,0x61212
.set Socket_Ioctl,0x41212
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = flags (Socket_IoctlNo)
   @  R2 = argp (pointer to data)

.set XSocket_Read,0x61213
.set Socket_Read,0x41213
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = buf (pointer to data)
   @  R2 = len (Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Write,0x61214
.set Socket_Write,0x41214
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> msg (data)
   @  R2 = len (Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Stat,0x61215
.set Socket_Stat,0x41215

.set XSocket_Readv,0x61216
.set Socket_Readv,0x41216
   @Entry
   @  R0 = s (Socket_S)
   @  R1 = iov (pointer to Socket_Iovec)
   @  R2 = iov_count (Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Writev,0x61217
.set Socket_Writev,0x41217
   @Entry
   @  R0 = s (Socket_S)
   @  R1 -> iov (Socket_Iovec)
   @  R2 = iov_count (Int)
   @Exit
   @  R0 = cc (Int)

.set XSocket_Gettsize,0x61218
.set Socket_Gettsize,0x41218
   @Exit
   @  R0 = size (Int)

.set XSocket_Sendtosm,0x61219
.set Socket_Sendtosm,0x41219

.set XSocket_Sysctl,0x6121a
.set Socket_Sysctl,0x4121a

.set XSocket_Accept_1,0x6121b
.set Socket_Accept_1,0x4121b

.set XSocket_Recvfrom_1,0x6121c
.set Socket_Recvfrom_1,0x4121c

.set XSocket_Recvmsg_1,0x6121d
.set Socket_Recvmsg_1,0x4121d

.set XSocket_Sendmsg_1,0x6121e
.set Socket_Sendmsg_1,0x4121e

.set XSocket_Getpeername_1,0x6121f
.set Socket_Getpeername_1,0x4121f

.set XSocket_Getsockname_1,0x61220
.set Socket_Getsockname_1,0x41220

.set XSocket_InternalLookup,0x61221
.set Socket_InternalLookup,0x41221

.set XSocket_Version,0x61222
.set Socket_Version,0x41222
   @Exit
   @  R0 = n (Int)

.set XSocket_Filter,0x61223
.set Socket_Filter,0x41223

#  define Socket_FilterDeregister 0x0
   @Entry
   @  R0 = &0
   @  R1 = addr_family (Socket_AF)
   @  R2 = prot_hash (Int)
   @  R3 = routine (pointer to code)
   @  R4 = priv_word (Int)

#  define Socket_FilterRegister 0x1
   @Entry
   @  R0 = &1
   @  R1 = addr_family (Socket_AF)
   @  R2 = prot_hash (Int)
   @  R3 = routine (pointer to code)
   @  R4 = priv_word (Int)

#  define Event_Internet 0x13
   @Entry
   @  R0 = &13
   @  R1 = event_type (Socket_EventType)
   @  R2 = s (Socket_S)

#  define EventInternet_Async 0x1
   @Entry
   @  R0 = &13
   @  R1 = &1
   @  R2 = s (Socket_S)

#  define EventInternet_Urgent 0x2
   @Entry
   @  R0 = &13
   @  R1 = &2
   @  R2 = s (Socket_S)

#  define EventInternet_Broken 0x3
   @Entry
   @  R0 = &13
   @  R1 = &3
   @  R2 = s (Socket_S)

#  define EventInternet_RARPReply 0x4
   @Entry
   @  R0 = &13
   @  R1 = &4
   @  R2 = addr (Bits)
   @  R3 = req_addr (Bits)

#  define Service_InternetStatus8 0x8
   @Entry
   @  R0 = &8
   @  R1 = &B0
   @  R2 -> interface_name (Char)
   @  R3 -> dib (data)
   @  R4 = ip_address (Int)
   @  R5 -> hw_address (data)
   @Exit
   @  R1 = unclaimed (Bool)

#endif
