aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/net/net_windows.c.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/net/net_windows.c.v')
-rw-r--r--v_windows/v/vlib/net/net_windows.c.v780
1 files changed, 780 insertions, 0 deletions
diff --git a/v_windows/v/vlib/net/net_windows.c.v b/v_windows/v/vlib/net/net_windows.c.v
new file mode 100644
index 0000000..337176f
--- /dev/null
+++ b/v_windows/v/vlib/net/net_windows.c.v
@@ -0,0 +1,780 @@
+module net
+
+// WsaError is all of the socket errors that WSA provides from WSAGetLastError
+pub enum WsaError {
+ //
+ // MessageId: WSAEINTR
+ //
+ // MessageText:
+ //
+ // A blocking operation was interrupted by a call to WSACancelBlockingCall.
+ //
+ wsaeintr = 10004
+ //
+ // MessageId: WSAEBADF
+ //
+ // MessageText:
+ //
+ // The file handle supplied is not valid.
+ //
+ wsaebadf = 10009
+ //
+ // MessageId: WSAEACCES
+ //
+ // MessageText:
+ //
+ // An attempt was made to access a socket in a way forbidden by its access permissions.
+ //
+ wsaeacces = 10013
+ //
+ // MessageId: WSAEFAULT
+ //
+ // MessageText:
+ //
+ // The system detected an invalid pointer address in attempting to use a pointer argument in a call.
+ //
+ wsaefault = 10014
+ //
+ // MessageId: WSAEINVAL
+ //
+ // MessageText:
+ //
+ // An invalid argument was supplied.
+ //
+ wsaeinval = 10022
+ //
+ // MessageId: WSAEMFILE
+ //
+ // MessageText:
+ //
+ // Too many open sockets.
+ //
+ wsaemfile = 10024
+ //
+ // MessageId: WSAEWOULDBLOCK
+ //
+ // MessageText:
+ //
+ // A non-blocking socket operation could not be completed immediately.
+ //
+ wsaewouldblock = 10035
+ //
+ // MessageId: WSAEINPROGRESS
+ //
+ // MessageText:
+ //
+ // A blocking operation is currently executing.
+ //
+ wsaeinprogress = 10036
+ //
+ // MessageId: WSAEALREADY
+ //
+ // MessageText:
+ //
+ // An operation was attempted on a non-blocking socket that already had an operation in progress.
+ //
+ wsaealready = 10037
+ //
+ // MessageId: WSAENOTSOCK
+ //
+ // MessageText:
+ //
+ // An operation was attempted on something that is not a socket.
+ //
+ wsaenotsock = 10038
+ //
+ // MessageId: WSAEDESTADDRREQ
+ //
+ // MessageText:
+ //
+ // A required address was omitted from an operation on a socket.
+ //
+ wsaedestaddrreq = 10039
+ //
+ // MessageId: WSAEMSGSIZE
+ //
+ // MessageText:
+ //
+ // A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
+ //
+ wsaemsgsize = 10040
+ //
+ // MessageId: WSAEPROTOTYPE
+ //
+ // MessageText:
+ //
+ // A protocol was specified in the socket function call that does not support the semantics of the socket type requested.
+ //
+ wsaeprototype = 10041
+ //
+ // MessageId: WSAENOPROTOOPT
+ //
+ // MessageText:
+ //
+ // An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call.
+ //
+ wsaenoprotoopt = 10042
+ //
+ // MessageId: WSAEPROTONOSUPPORT
+ //
+ // MessageText:
+ //
+ // The requested protocol has not been configured into the system, or no implementation for it exists.
+ //
+ wsaeprotonosupport = 10043
+ //
+ // MessageId: WSAESOCKTNOSUPPORT
+ //
+ // MessageText:
+ //
+ // The support for the specified socket type does not exist in this address family.
+ //
+ wsaesocktnosupport = 10044
+ //
+ // MessageId: WSAEOPNOTSUPP
+ //
+ // MessageText:
+ //
+ // The attempted operation is not supported for the type of object referenced.
+ //
+ wsaeopnotsupp = 10045
+ //
+ // MessageId: WSAEPFNOSUPPORT
+ //
+ // MessageText:
+ //
+ // The protocol family has not been configured into the system or no implementation for it exists.
+ //
+ wsaepfnosupport = 10046
+ //
+ // MessageId: WSAEAFNOSUPPORT
+ //
+ // MessageText:
+ //
+ // An address incompatible with the requested protocol was used.
+ //
+ wsaeafnosupport = 10047
+ //
+ // MessageId: WSAEADDRINUSE
+ //
+ // MessageText:
+ //
+ // Only one usage of each socket address (protocol/network address/port) is normally permitted.
+ //
+ wsaeaddrinuse = 10048
+ //
+ // MessageId: WSAEADDRNOTAVAIL
+ //
+ // MessageText:
+ //
+ // The requested address is not valid in its context.
+ //
+ wsaeaddrnotavail = 10049
+ //
+ // MessageId: WSAENETDOWN
+ //
+ // MessageText:
+ //
+ // A socket operation encountered a dead network.
+ //
+ wsaenetdown = 10050
+ //
+ // MessageId: WSAENETUNREACH
+ //
+ // MessageText:
+ //
+ // A socket operation was attempted to an unreachable network.
+ //
+ wsaenetunreach = 10051
+ //
+ // MessageId: WSAENETRESET
+ //
+ // MessageText:
+ //
+ // The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.
+ //
+ wsaenetreset = 10052
+ //
+ // MessageId: WSAECONNABORTED
+ //
+ // MessageText:
+ //
+ // An established connection was aborted by the software in your host machine.
+ //
+ wsaeconnaborted = 10053
+ //
+ // MessageId: WSAECONNRESET
+ //
+ // MessageText:
+ //
+ // An existing connection was forcibly closed by the remote host.
+ //
+ wsaeconnreset = 10054
+ //
+ // MessageId: WSAENOBUFS
+ //
+ // MessageText:
+ //
+ // An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
+ //
+ wsaenobufs = 10055
+ //
+ // MessageId: WSAEISCONN
+ //
+ // MessageText:
+ //
+ // A connect request was made on an already connected socket.
+ //
+ wsaeisconn = 10056
+ //
+ // MessageId: WSAENOTCONN
+ //
+ // MessageText:
+ //
+ // A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied.
+ //
+ wsaenotconn = 10057
+ //
+ // MessageId: WSAESHUTDOWN
+ //
+ // MessageText:
+ //
+ // A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call.
+ //
+ wsaeshutdown = 10058
+ //
+ // MessageId: WSAETOOMANYREFS
+ //
+ // MessageText:
+ //
+ // Too many references to some kernel object.
+ //
+ wsaetoomanyrefs = 10059
+ //
+ // MessageId: WSAETIMEDOUT
+ //
+ // MessageText:
+ //
+ // A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
+ //
+ wsaetimedout = 10060
+ //
+ // MessageId: WSAECONNREFUSED
+ //
+ // MessageText:
+ //
+ // No connection could be made because the target machine actively refused it.
+ //
+ wsaeconnrefused = 10061
+ //
+ // MessageId: WSAELOOP
+ //
+ // MessageText:
+ //
+ // Cannot translate name.
+ //
+ wsaeloop = 10062
+ //
+ // MessageId: WSAENAMETOOLONG
+ //
+ // MessageText:
+ //
+ // Name component or name was too long.
+ //
+ wsaenametoolong = 10063
+ //
+ // MessageId: WSAEHOSTDOWN
+ //
+ // MessageText:
+ //
+ // A socket operation failed because the destination host was down.
+ //
+ wsaehostdown = 10064
+ //
+ // MessageId: WSAEHOSTUNREACH
+ //
+ // MessageText:
+ //
+ // A socket operation was attempted to an unreachable host.
+ //
+ wsaehostunreach = 10065
+ //
+ // MessageId: WSAENOTEMPTY
+ //
+ // MessageText:
+ //
+ // Cannot remove a directory that is not empty.
+ //
+ wsaenotempty = 10066
+ //
+ // MessageId: WSAEPROCLIM
+ //
+ // MessageText:
+ //
+ // A Windows Sockets implementation may have a limit on the number of applications that may use it simultaneously.
+ //
+ wsaeproclim = 10067
+ //
+ // MessageId: WSAEUSERS
+ //
+ // MessageText:
+ //
+ // Ran out of quota.
+ //
+ wsaeusers = 10068
+ //
+ // MessageId: WSAEDQUOT
+ //
+ // MessageText:
+ //
+ // Ran out of disk quota.
+ //
+ wsaedquot = 10069
+ //
+ // MessageId: WSAESTALE
+ //
+ // MessageText:
+ //
+ // File handle reference is no longer available.
+ //
+ wsaestale = 10070
+ //
+ // MessageId: WSAEREMOTE
+ //
+ // MessageText:
+ //
+ // Item is not available locally.
+ //
+ wsaeremote = 10071
+ //
+ // MessageId: WSASYSNOTREADY
+ //
+ // MessageText:
+ //
+ // WSAStartup cannot function at this time because the underlying system it uses to provide network services is currently unavailable.
+ //
+ wsasysnotready = 10091
+ //
+ // MessageId: WSAVERNOTSUPPORTED
+ //
+ // MessageText:
+ //
+ // The Windows Sockets version requested is not supported.
+ //
+ wsavernotsupported = 10092
+ //
+ // MessageId: WSANOTINITIALISED
+ //
+ // MessageText:
+ //
+ // Either the application has not called WSAStartup, or WSAStartup failed.
+ //
+ wsanotinitialised = 10093
+ //
+ // MessageId: WSAEDISCON
+ //
+ // MessageText:
+ //
+ // Returned by WSARecv or WSARecvFrom to indicate the remote party has initiated a graceful shutdown sequence.
+ //
+ wsaediscon = 10101
+ //
+ // MessageId: WSAENOMORE
+ //
+ // MessageText:
+ //
+ // No more results can be returned by WSALookupServiceNext.
+ //
+ wsaenomore = 10102
+ //
+ // MessageId: WSAECANCELLED
+ //
+ // MessageText:
+ //
+ // A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.
+ //
+ wsaecancelled = 10103
+ //
+ // MessageId: WSAEINVALIDPROCTABLE
+ //
+ // MessageText:
+ //
+ // The procedure call table is invalid.
+ //
+ wsaeinvalidproctable = 10104
+ //
+ // MessageId: WSAEINVALIDPROVIDER
+ //
+ // MessageText:
+ //
+ // The requested service provider is invalid.
+ //
+ wsaeinvalidprovider = 10105
+ //
+ // MessageId: WSAEPROVIDERFAILEDINIT
+ //
+ // MessageText:
+ //
+ // The requested service provider could not be loaded or initialized.
+ //
+ wsaeproviderfailedinit = 10106
+ //
+ // MessageId: WSASYSCALLFAILURE
+ //
+ // MessageText:
+ //
+ // A system call has failed.
+ //
+ wsasyscallfailure = 10107
+ //
+ // MessageId: WSASERVICE_NOT_FOUND
+ //
+ // MessageText:
+ //
+ // No such service is known. The service cannot be found in the specified name space.
+ //
+ wsaservice_not_found = 10108
+ //
+ // MessageId: WSATYPE_NOT_FOUND
+ //
+ // MessageText:
+ //
+ // The specified class was not found.
+ //
+ wsatype_not_found = 10109
+ //
+ // MessageId: WSA_E_NO_MORE
+ //
+ // MessageText:
+ //
+ // No more results can be returned by WSALookupServiceNext.
+ //
+ wsa_e_no_more = 10110
+ //
+ // MessageId: WSA_E_CANCELLED
+ //
+ // MessageText:
+ //
+ // A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.
+ //
+ wsa_e_cancelled = 10111
+ //
+ // MessageId: WSAEREFUSED
+ //
+ // MessageText:
+ //
+ // A database query failed because it was actively refused.
+ //
+ wsaerefused = 10112
+ //
+ // MessageId: WSAHOST_NOT_FOUND
+ //
+ // MessageText:
+ //
+ // No such host is known.
+ //
+ wsahost_not_found = 11001
+ //
+ // MessageId: WSATRY_AGAIN
+ //
+ // MessageText:
+ //
+ // This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server.
+ //
+ wsatry_again = 11002
+ //
+ // MessageId: WSANO_RECOVERY
+ //
+ // MessageText:
+ //
+ // A non-recoverable error occurred during a database lookup.
+ //
+ wsano_recovery = 11003
+ //
+ // MessageId: WSANO_DATA
+ //
+ // MessageText:
+ //
+ // The requested name is valid, but no data of the requested type was found.
+ //
+ wsano_data = 11004
+ //
+ // MessageId: WSA_QOS_RECEIVERS
+ //
+ // MessageText:
+ //
+ // At least one reserve has arrived.
+ //
+ wsa_qos_receivers = 11005
+ //
+ // MessageId: WSA_QOS_SENDERS
+ //
+ // MessageText:
+ //
+ // At least one path has arrived.
+ //
+ wsa_qos_senders = 11006
+ //
+ // MessageId: WSA_QOS_NO_SENDERS
+ //
+ // MessageText:
+ //
+ // There are no senders.
+ //
+ wsa_qos_no_senders = 11007
+ //
+ // MessageId: WSA_QOS_NO_RECEIVERS
+ //
+ // MessageText:
+ //
+ // There are no receivers.
+ //
+ wsa_qos_no_receivers = 11008
+ //
+ // MessageId: WSA_QOS_REQUEST_CONFIRMED
+ //
+ // MessageText:
+ //
+ // Reserve has been confirmed.
+ //
+ wsa_qos_request_confirmed = 11009
+ //
+ // MessageId: WSA_QOS_ADMISSION_FAILURE
+ //
+ // MessageText:
+ //
+ // Error due to lack of resources.
+ //
+ wsa_qos_admission_failure = 11010
+ //
+ // MessageId: WSA_QOS_POLICY_FAILURE
+ //
+ // MessageText:
+ //
+ // Rejected for administrative reasons - bad credentials.
+ //
+ wsa_qos_policy_failure = 11011
+ //
+ // MessageId: WSA_QOS_BAD_STYLE
+ //
+ // MessageText:
+ //
+ // Unknown or conflicting style.
+ //
+ wsa_qos_bad_style = 11012
+ //
+ // MessageId: WSA_QOS_BAD_OBJECT
+ //
+ // MessageText:
+ //
+ // Problem with some part of the filterspec or providerspecific buffer in general.
+ //
+ wsa_qos_bad_object = 11013
+ //
+ // MessageId: WSA_QOS_TRAFFIC_CTRL_ERROR
+ //
+ // MessageText:
+ //
+ // Problem with some part of the flowspec.
+ //
+ wsa_qos_traffic_ctrl_error = 11014
+ //
+ // MessageId: WSA_QOS_GENERIC_ERROR
+ //
+ // MessageText:
+ //
+ // General QOS error.
+ //
+ wsa_qos_generic_error = 11015
+ //
+ // MessageId: WSA_QOS_ESERVICETYPE
+ //
+ // MessageText:
+ //
+ // An invalid or unrecognized service type was found in the flowspec.
+ //
+ wsa_qos_eservicetype = 11016
+ //
+ // MessageId: WSA_QOS_EFLOWSPEC
+ //
+ // MessageText:
+ //
+ // An invalid or inconsistent flowspec was found in the QOS structure.
+ //
+ wsa_qos_eflowspec = 11017
+ //
+ // MessageId: WSA_QOS_EPROVSPECBUF
+ //
+ // MessageText:
+ //
+ // Invalid QOS provider-specific buffer.
+ //
+ wsa_qos_eprovspecbuf = 11018
+ //
+ // MessageId: WSA_QOS_EFILTERSTYLE
+ //
+ // MessageText:
+ //
+ // An invalid QOS filter style was used.
+ //
+ wsa_qos_efilterstyle = 11019
+ //
+ // MessageId: WSA_QOS_EFILTERTYPE
+ //
+ // MessageText:
+ //
+ // An invalid QOS filter type was used.
+ //
+ wsa_qos_efiltertype = 11020
+ //
+ // MessageId: WSA_QOS_EFILTERCOUNT
+ //
+ // MessageText:
+ //
+ // An incorrect number of QOS FILTERSPECs were specified in the FLOWDESCRIPTOR.
+ //
+ wsa_qos_efiltercount = 11021
+ //
+ // MessageId: WSA_QOS_EOBJLENGTH
+ //
+ // MessageText:
+ //
+ // An object with an invalid ObjectLength field was specified in the QOS provider-specific buffer.
+ //
+ wsa_qos_eobjlength = 11022
+ //
+ // MessageId: WSA_QOS_EFLOWCOUNT
+ //
+ // MessageText:
+ //
+ // An incorrect number of flow descriptors was specified in the QOS structure.
+ //
+ wsa_qos_eflowcount = 11023
+ //
+ // MessageId: WSA_QOS_EUNKOWNPSOBJ
+ //
+ // MessageText:
+ //
+ // An unrecognized object was found in the QOS provider-specific buffer.
+ //
+ wsa_qos_eunkownpsobj = 11024
+ //
+ // MessageId: WSA_QOS_EPOLICYOBJ
+ //
+ // MessageText:
+ //
+ // An invalid policy object was found in the QOS provider-specific buffer.
+ //
+ wsa_qos_epolicyobj = 11025
+ //
+ // MessageId: WSA_QOS_EFLOWDESC
+ //
+ // MessageText:
+ //
+ // An invalid QOS flow descriptor was found in the flow descriptor list.
+ //
+ wsa_qos_eflowdesc = 11026
+ //
+ // MessageId: WSA_QOS_EPSFLOWSPEC
+ //
+ // MessageText:
+ //
+ // An invalid or inconsistent flowspec was found in the QOS provider specific buffer.
+ //
+ wsa_qos_epsflowspec = 11027
+ //
+ // MessageId: WSA_QOS_EPSFILTERSPEC
+ //
+ // MessageText:
+ //
+ // An invalid FILTERSPEC was found in the QOS provider-specific buffer.
+ //
+ wsa_qos_epsfilterspec = 11028
+ //
+ // MessageId: WSA_QOS_ESDMODEOBJ
+ //
+ // MessageText:
+ //
+ // An invalid shape discard mode object was found in the QOS provider specific buffer.
+ //
+ wsa_qos_esdmodeobj = 11029
+ //
+ // MessageId: WSA_QOS_ESHAPERATEOBJ
+ //
+ // MessageText:
+ //
+ // An invalid shaping rate object was found in the QOS provider-specific buffer.
+ //
+ wsa_qos_eshaperateobj = 11030
+ //
+ // MessageId: WSA_QOS_RESERVED_PETYPE
+ //
+ // MessageText:
+ //
+ // A reserved policy element was found in the QOS provider-specific buffer.
+ //
+ wsa_qos_reserved_petype = 11031
+ //
+ // MessageId: WSA_SECURE_HOST_NOT_FOUND
+ //
+ // MessageText:
+ //
+ // No such host is known securely.
+ //
+ wsa_secure_host_not_found = 11032
+ //
+ // MessageId: WSA_IPSEC_NAME_POLICY_ERROR
+ //
+ // MessageText:
+ //
+ // Name based IPSEC policy could not be added.
+ //
+ wsa_ipsec_name_policy_error = 11033
+}
+
+// wsa_error casts an int to its WsaError value
+pub fn wsa_error(code int) WsaError {
+ return WsaError(code)
+}
+
+const (
+ error_ewouldblock = WsaError.wsaewouldblock
+)
+
+// Link to Winsock library
+#flag -lws2_32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+// Constants that windows needs
+const (
+ fionbio = C.FIONBIO
+ msg_nosignal = 0
+ wsa_v22 = 0x202 // C.MAKEWORD(2, 2)
+)
+
+// Error code returns the last socket error
+fn error_code() int {
+ return C.WSAGetLastError()
+}
+
+struct C.WSAData {
+mut:
+ wVersion u16
+ wHighVersion u16
+ szDescription [257]byte
+ szSystemStatus [129]byte
+ iMaxSockets u16
+ iMaxUdpDg u16
+ lpVendorInfo &byte
+}
+
+fn init() {
+ mut wsadata := C.WSAData{
+ lpVendorInfo: 0
+ }
+ res := C.WSAStartup(net.wsa_v22, &wsadata)
+ if res != 0 {
+ panic('socket: WSAStartup failed')
+ }
+}