mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* Fixing issue #15302 -- lwip doesn't support signals * Adding test to catch issue #15302 -- lwip/freertos net library don't try to build / run on windows, it'll compile only but not run Fixing issue #15302 -- reworking test to compile on other platforms
This commit is contained in:
@@ -179,7 +179,7 @@ const
|
||||
props: {ospNeedsPIC, ospPosix}),
|
||||
(name: "FreeRTOS", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/",
|
||||
objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/",
|
||||
scriptExt: ".sh", curDir: ".", exeExt: ".elf", extSep: ".",
|
||||
scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".",
|
||||
props: {ospPosix}),
|
||||
(name: "Any", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/",
|
||||
objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/",
|
||||
|
||||
@@ -220,11 +220,11 @@ var IPV6_UNICAST_HOPS* {.importc: "IPV6_UNICAST_HOPS", header: "<sys/socket.h>".
|
||||
var IPV6_V6ONLY* {.importc: "IPV6_V6ONLY", header: "<sys/socket.h>".}: cint
|
||||
|
||||
# <netinet/tcp.h>
|
||||
var TCP_NODELAY* {.importc: "TCP_NODELAY", header: "<sys/socket.h>".}: cint
|
||||
var TCP_KEEPALIVE* {.importc: "TCP_KEEPALIVE", header: "<sys/socket.h>".}: cint
|
||||
var TCP_KEEPIDLE* {.importc: "TCP_KEEPIDLE", header: "<sys/socket.h>".}: cint
|
||||
var TCP_KEEPINTVL* {.importc: "TCP_KEEPINTVL", header: "<sys/socket.h>".}: cint
|
||||
var TCP_KEEPCNT* {.importc: "TCP_KEEPCNT", header: "<sys/socket.h>".}: cint
|
||||
const TCP_NODELAY* = 0x01 # don't delay send to coalesce packets
|
||||
const TCP_KEEPALIVE* = 0x02 # send KEEPALIVE probes when idle for pcb->keep_idle milliseconds
|
||||
const TCP_KEEPIDLE* = 0x03 # set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt
|
||||
const TCP_KEEPINTVL* = 0x04 # set pcb->keep_intvl - Use seconds for get/setsockopt
|
||||
const TCP_KEEPCNT* = 0x05 # set pcb->keep_cnt - Use number of probes sent for get/setsockopt
|
||||
|
||||
# <nl_types.h>
|
||||
# var NL_SETD* {.importc: "NL_SETD", header: "<nl_types.h>".}: cint
|
||||
@@ -367,10 +367,25 @@ var SEM_FAILED* {.importc: "SEM_FAILED", header: "<semaphore.h>".}: pointer
|
||||
var FD_SETSIZE* {.importc: "FD_SETSIZE", header: "<sys/select.h>".}: cint
|
||||
|
||||
# <sys/socket.h>
|
||||
var MSG_CTRUNC* {.importc: "MSG_CTRUNC", header: "<sys/socket.h>".}: cint
|
||||
var MSG_DONTROUTE* {.importc: "MSG_DONTROUTE", header: "<sys/socket.h>".}: cint
|
||||
var MSG_EOR* {.importc: "MSG_EOR", header: "<sys/socket.h>".}: cint
|
||||
var MSG_OOB* {.importc: "MSG_OOB", header: "<sys/socket.h>".}: cint
|
||||
# struct msghdr->msg_flags bit field values
|
||||
const MSG_TRUNC* = 0x04
|
||||
const MSG_CTRUNC* = 0x08
|
||||
|
||||
# Flags we can use with send and recv.
|
||||
const MSG_PEEK* = 0x01 # Peeks at an incoming message
|
||||
const MSG_WAITALL* = 0x02 # Unimplemented: Requests that the function block until the full amount of data requested can be returned
|
||||
const MSG_OOB* = 0x04 # Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific
|
||||
const MSG_DONTWAIT* = 0x08 # Nonblocking i/o for this operation only
|
||||
const MSG_MORE* = 0x10 # Sender will send more
|
||||
# const MSG_NOSIGNAL* = 0x20 # Uninmplemented: Requests not to send the SIGPIPE signal if an attempt to send is made on a stream-oriented socket that is no longer connected.
|
||||
|
||||
# Alternately, they can defined like this, but the above seems better when they're known/stable values:
|
||||
# var MSG_TRUNC* {.importc: "MSG_TRUNC", header: "<sys/socket.h>".}: cint
|
||||
# var MSG_CTRUNC* {.importc: "MSG_CTRUNC", header: "<sys/socket.h>".}: cint
|
||||
# var MSG_DONTROUTE* {.importc: "MSG_DONTROUTE", header: "<sys/socket.h>".}: cint # not defined in lwip
|
||||
# var MSG_EOR* {.importc: "MSG_EOR", header: "<sys/socket.h>".}: cint # not defined in lwip
|
||||
# var MSG_OOB* {.importc: "MSG_OOB", header: "<sys/socket.h>".}: cint
|
||||
|
||||
|
||||
# var SCM_RIGHTS* {.importc: "SCM_RIGHTS", header: "<sys/socket.h>".}: cint
|
||||
var SO_ACCEPTCONN* {.importc: "SO_ACCEPTCONN", header: "<sys/socket.h>".}: cint
|
||||
@@ -401,9 +416,6 @@ var SOL_SOCKET* {.importc: "SOL_SOCKET", header: "<sys/socket.h>".}: cint
|
||||
const SocketMaxConnections {.intdefine.}: int = 32
|
||||
var SOMAXCONN*: cint = SocketMaxConnections.cint
|
||||
|
||||
var MSG_PEEK* {.importc: "MSG_PEEK", header: "<sys/socket.h>".}: cint
|
||||
var MSG_TRUNC* {.importc: "MSG_TRUNC", header: "<sys/socket.h>".}: cint
|
||||
var MSG_WAITALL* {.importc: "MSG_WAITALL", header: "<sys/socket.h>".}: cint
|
||||
var AF_INET* {.importc: "AF_INET", header: "<sys/socket.h>".}: cint
|
||||
var AF_INET6* {.importc: "AF_INET6", header: "<sys/socket.h>".}: cint
|
||||
# var AF_UNIX* {.importc: "AF_UNIX", header: "<sys/socket.h>".}: cint
|
||||
|
||||
@@ -625,6 +625,10 @@ elif defined(solaris):
|
||||
# Solaris doesn't have MSG_NOSIGNAL
|
||||
const
|
||||
MSG_NOSIGNAL* = 0'i32
|
||||
elif defined(freertos) or defined(lwip):
|
||||
# LwIP/FreeRTOS doesn't have MSG_NOSIGNAL
|
||||
const
|
||||
MSG_NOSIGNAL* = 0x20'i32
|
||||
else:
|
||||
var
|
||||
MSG_NOSIGNAL* {.importc, header: "<sys/socket.h>".}: cint
|
||||
|
||||
@@ -1061,7 +1061,7 @@ proc accept*(server: Socket, client: var owned(Socket),
|
||||
var addrDummy = ""
|
||||
acceptAddr(server, client, addrDummy, flags)
|
||||
|
||||
when defined(posix):
|
||||
when defined(posix) and not defined(lwip):
|
||||
from posix import Sigset, sigwait, sigismember, sigemptyset, sigaddset,
|
||||
sigprocmask, pthread_sigmask, SIGPIPE, SIG_BLOCK, SIG_UNBLOCK
|
||||
|
||||
@@ -1079,7 +1079,7 @@ template blockSigpipe(body: untyped): untyped =
|
||||
##
|
||||
## For convenience, this template is also available for non-POSIX system,
|
||||
## where `body` will be executed as-is.
|
||||
when not defined(posix):
|
||||
when not defined(posix) or defined(lwip):
|
||||
body
|
||||
else:
|
||||
template sigmask(how: cint, set, oset: var Sigset): untyped {.gensym.} =
|
||||
|
||||
30
tests/stdlib/tlwip.nim
Normal file
30
tests/stdlib/tlwip.nim
Normal file
@@ -0,0 +1,30 @@
|
||||
discard """
|
||||
targets: "c"
|
||||
cmd: "nim $target --os:freertos --gc:arc $options $file"
|
||||
disabled: "bsd"
|
||||
disabled: "windows"
|
||||
action: compile
|
||||
"""
|
||||
|
||||
# Note:
|
||||
# This file tests FreeRTOS/LwIP cross-compilation on UNIX platforms
|
||||
# Windows should run when compiled with esp-idf, however I'm not
|
||||
# sure how to test for only compilation on Windows without running
|
||||
# a test exe
|
||||
#
|
||||
# Note:
|
||||
# disabling *BSDs since they're not playing well with `gcc`
|
||||
|
||||
import net
|
||||
import asynchttpserver, asyncdispatch
|
||||
|
||||
proc cb*(req: Request) {.async.} =
|
||||
await req.respond(Http200, "Hello World")
|
||||
|
||||
proc run_http_server*() {.exportc.} =
|
||||
echo "starting http server"
|
||||
var server = newAsyncHttpServer()
|
||||
|
||||
waitFor server.serve(Port(8181), cb)
|
||||
|
||||
echo("ok")
|
||||
Reference in New Issue
Block a user