1
1
from utils import StaticTuple
2
- from sys.ffi import external_call
2
+ from sys.ffi import external_call, c_char, c_int, c_size_t, c_ssize_t, c_uchar, c_ushort, c_uint
3
3
from sys.info import sizeof, os_is_windows, os_is_macos, os_is_linux
4
4
from memory import memcpy, UnsafePointer, stack_allocation
5
5
from lightbug_http.io.bytes import Bytes
@@ -13,30 +13,9 @@ alias EPROTONOSUPPORT = 93
13
13
alias SUCCESS = 0
14
14
alias GRND_NONBLOCK : UInt8 = 1
15
15
16
- alias char_UnsafePointer = UnsafePointer[c_char]
17
-
18
16
# Adapted from https://github.com/crisadamo/mojo-Libc . Huge thanks to Cristian!
19
17
# C types
20
18
alias c_void = UInt8
21
- alias c_char = UInt8
22
- alias c_schar = Int8
23
- alias c_uchar = UInt8
24
- alias c_short = Int16
25
- alias c_ushort = UInt16
26
- alias c_int = Int32
27
- alias c_uint = UInt32
28
- alias c_long = Int64
29
- alias c_ulong = UInt64
30
- alias c_float = Float32
31
- alias c_double = Float64
32
-
33
- # `Int` is known to be machine's width
34
- alias c_size_t = Int
35
- alias c_ssize_t = Int
36
-
37
- alias ptrdiff_t = Int64
38
- alias intptr_t = Int64
39
- alias uintptr_t = UInt64
40
19
41
20
42
21
# --- ( error.h Constants )-----------------------------------------------------
@@ -579,21 +558,14 @@ fn inet_ntop[address_family: AddressFamily, address_length: AddressLength](ip_ad
579
558
580
559
# TODO : For some reason, using a pointer instead of a String here leads to a "tried to free invalid ptr crash".
581
560
# Ideally we should try not to modify private members of the String.
582
- var dst = String( capacity = address_length.value)
561
+ var dst = UnsafePointer[c_char].alloc( address_length.value + 1 )
583
562
var result = _inet_ntop(
584
563
address_family.value,
585
- UnsafePointer.address_of( ip_address).bitcast[c_void](),
586
- dst.unsafe_ptr() ,
564
+ UnsafePointer( to = ip_address).bitcast[c_void](),
565
+ dst,
587
566
address_length.value,
588
567
)
589
568
590
- var i = 0
591
- while i <= address_length.value:
592
- if result[i] == 0 :
593
- break
594
- i += 1
595
- dst._buffer._len = i + 1
596
-
597
569
# `inet_ntop` returns NULL on error.
598
570
if not result:
599
571
var errno = get_errno()
@@ -607,8 +579,14 @@ fn inet_ntop[address_family: AddressFamily, address_length: AddressLength](ip_ad
607
579
else :
608
580
raise Error(" inet_ntop Error: An error occurred while converting the address. Error code: " + String(errno))
609
581
610
- # We want the string representation of the address, so it's ok to take ownership of the pointer here.
611
- return dst^
582
+ var i = 0
583
+ while i <= address_length.value:
584
+ if result[i] == 0 :
585
+ break
586
+ i += 1
587
+
588
+ # Copy the dst pointer's contents into a new String.
589
+ return String(StringSlice(ptr = dst.bitcast[c_uchar](), length = i))
612
590
613
591
614
592
fn _inet_pton (af : c_int, src : UnsafePointer[c_char, mut=False ], dst : UnsafePointer[c_void]) -> c_int:
@@ -642,7 +620,7 @@ fn _inet_pton(af: c_int, src: UnsafePointer[c_char, mut=False], dst: UnsafePoint
642
620
](af, src, dst)
643
621
644
622
645
- fn inet_pton [address_family : AddressFamily](src : UnsafePointer[c_char, mut= False ] ) raises -> c_uint:
623
+ fn inet_pton [address_family : AddressFamily](owned src : String ) raises -> c_uint:
646
624
""" Libc POSIX `inet_pton` function. Converts a presentation format address (that is, printable form as held in a character string)
647
625
to network format (usually a struct in_addr or some other internal binary representation, in network byte order).
648
626
@@ -679,7 +657,7 @@ fn inet_pton[address_family: AddressFamily](src: UnsafePointer[c_char, mut=False
679
657
else :
680
658
ip_buffer = stack_allocation[4 , c_void]()
681
659
682
- var result = _inet_pton(address_family.value, src, ip_buffer)
660
+ var result = _inet_pton(address_family.value, src.unsafe_cstr_ptr().origin_cast[mut= False ]() , ip_buffer)
683
661
if result == 0 :
684
662
raise Error(" inet_pton Error: The input is not a valid address." )
685
663
elif result == - 1 :
@@ -847,7 +825,7 @@ fn setsockopt(
847
825
#### Notes:
848
826
* Reference: https://man7.org/linux/man-pages/man3/setsockopt.3p.html .
849
827
"""
850
- var result = _setsockopt(socket, level, option_name, Pointer.address_of( option_value), sizeof[Int]())
828
+ var result = _setsockopt(socket, level, option_name, Pointer( to = option_value), sizeof[Int]())
851
829
if result == - 1 :
852
830
var errno = get_errno()
853
831
if errno == EBADF :
@@ -939,7 +917,7 @@ fn getsockopt(
939
917
"""
940
918
var option_value = stack_allocation[1 , c_void]()
941
919
var option_len : socklen_t = sizeof[Int]()
942
- var result = _getsockopt(socket, level, option_name, option_value, Pointer.address_of( option_len))
920
+ var result = _getsockopt(socket, level, option_name, option_value, Pointer( to = option_len))
943
921
if result == - 1 :
944
922
var errno = get_errno()
945
923
if errno == EBADF :
@@ -1089,7 +1067,7 @@ fn getpeername(file_descriptor: c_int) raises -> sockaddr_in:
1089
1067
* Reference: https://man7.org/linux/man-pages/man2/getpeername.2.html .
1090
1068
"""
1091
1069
var remote_address = stack_allocation[1 , sockaddr]()
1092
- var result = _getpeername(file_descriptor, remote_address, Pointer.address_of( socklen_t(sizeof[sockaddr]())))
1070
+ var result = _getpeername(file_descriptor, remote_address, Pointer( to = socklen_t(sizeof[sockaddr]())))
1093
1071
if result == - 1 :
1094
1072
var errno = get_errno()
1095
1073
if errno == EBADF :
@@ -1173,7 +1151,7 @@ fn bind(socket: c_int, address: sockaddr_in) raises:
1173
1151
#### Notes:
1174
1152
* Reference: https://man7.org/linux/man-pages/man3/bind.3p.html .
1175
1153
"""
1176
- var result = _bind(socket, Pointer.address_of( address), sizeof[sockaddr_in]())
1154
+ var result = _bind(socket, Pointer( to = address), sizeof[sockaddr_in]())
1177
1155
if result == - 1 :
1178
1156
var errno = get_errno()
1179
1157
if errno == EACCES :
@@ -1330,7 +1308,7 @@ fn accept(socket: c_int) raises -> c_int:
1330
1308
* Reference: https://man7.org/linux/man-pages/man3/accept.3p.html .
1331
1309
"""
1332
1310
var remote_address = sockaddr()
1333
- var result = _accept(socket, Pointer.address_of( remote_address), Pointer.address_of( socklen_t(sizeof[socklen_t]())))
1311
+ var result = _accept(socket, Pointer( to = remote_address), Pointer( to = socklen_t(sizeof[socklen_t]())))
1334
1312
if result == - 1 :
1335
1313
var errno = get_errno()
1336
1314
if Int(errno) in [EAGAIN , EWOULDBLOCK ]:
@@ -1432,7 +1410,7 @@ fn connect(socket: c_int, address: sockaddr_in) raises:
1432
1410
#### Notes:
1433
1411
* Reference: https://man7.org/linux/man-pages/man3/connect.3p.html .
1434
1412
"""
1435
- var result = _connect(socket, Pointer.address_of( address), sizeof[sockaddr_in]())
1413
+ var result = _connect(socket, Pointer( to = address), sizeof[sockaddr_in]())
1436
1414
if result == - 1 :
1437
1415
var errno = get_errno()
1438
1416
if errno == EACCES :
@@ -1659,7 +1637,7 @@ fn recvfrom(
1659
1637
* `MSG_WAITALL`: On SOCK_STREAM sockets this requests that the function block until the full amount of data can be returned. The function may return the smaller amount of data if the socket is a message-based socket, if a signal is caught, if the connection is terminated, if MSG_PEEK was specified, or if an error is pending for the socket.
1660
1638
1661
1639
"""
1662
- var result = _recvfrom(socket, buffer, length, flags, address, Pointer[socklen_t].address_of( sizeof[sockaddr]()))
1640
+ var result = _recvfrom(socket, buffer, length, flags, address, Pointer[socklen_t]( to = sizeof[sockaddr]()))
1663
1641
if result == - 1 :
1664
1642
var errno = get_errno()
1665
1643
if Int(errno) in [EAGAIN , EWOULDBLOCK ]:
@@ -1858,7 +1836,7 @@ fn _sendto(
1858
1836
" sendto" ,
1859
1837
c_ssize_t,
1860
1838
c_int,
1861
- UnsafePointer[c_char , mut=False ],
1839
+ UnsafePointer[c_void , mut=False ],
1862
1840
c_size_t,
1863
1841
c_int,
1864
1842
UnsafePointer[sockaddr, mut=False ],
0 commit comments