Commit graph

40 commits

Author SHA1 Message Date
Linus Groh
6e19ab2bbc AK+Everywhere: Rename String to DeprecatedString
We have a new, improved string type coming up in AK (OOM aware, no null
state), and while it's going to use UTF-8, the name UTF8String is a
mouthful - so let's free up the String name by renaming the existing
class.
Making the old one have an annoying name will hopefully also help with
quick adoption :^)
2022-12-06 08:54:33 +01:00
Sam Atkins
cb5f83606a LibCore: Optionally pass MSG_NOSIGNAL to socket read/writes
When creating a `Core::Stream::Socket`, you can now choose to prevent
SIGPIPE signals from firing and terminating your process. This is done
by passing MSG_NOSIGNAL to the `System::recv()` or `System::send()`
calls when you `read()` or `write()` to that Socket.
2022-12-03 14:27:05 +01:00
Tim Schumacher
6e29619dcb LibCore: Add Stream::discard() 2022-11-30 08:03:31 +01:00
Tim Schumacher
7a065513cd LibCore: Add a basic wrapper for adapting AK::Stream to Core::Stream 2022-11-30 08:03:31 +01:00
davidot
d9360676cd LibCore: Add standard_{output, input, error} functions to File::Stream 2022-10-12 12:00:21 -06:00
davidot
e0cccaa583 LibCore: Add option to Stream::File to not close the file on destruction 2022-10-12 12:00:21 -06:00
Andrew Kaster
1d533acbc0 AK+Userland: Replace Linux, macOS, and *BSD macros with platform defines
We have such nice platform macros, let's clean up any remnants of manual
__my_platform__ macros in LibCore, LibCompress and AK.
2022-10-10 12:23:12 +02:00
Andrew Kaster
828441852f Everywhere: Replace uses of __serenity__ with AK_OS_SERENITY
Now that we have OS macros for essentially every supported OS, let's try
to use them everywhere.
2022-10-10 12:23:12 +02:00
Andrew Kaster
a81475d9fb LibCore: Don't assume that the first address from getaddrinfo is IPv4
By passing AF_UNSPEC to getaddrinfo, we're telling the system's
implementation that we are ok getting either (or both) IPv4 and IPv6
addresses in our result. On my Ubuntu 22.04 system, the first addrinfo
returned for "www.google.com" holds an IPv6 address, which when
interpreted as an IPv4 sockaddr_in gives an address of 0.0.0.0.

This fixes TestTLSHandshake in Lagom locally.
2022-10-10 12:23:12 +02:00
Gunnar Beutner
400cc41176 LibCore: Make Core::System::{send,recv}fd work on macOS
All the required bits were already there. Also, this would probably
work on FreeBSD without modification but I don't currently have
a system to test this on.
2022-10-07 18:14:48 +01:00
Andreas Kling
eb709ddd63 LibCore: Add fd() and notifier() accessors to Core::Stream::LocalSocket 2022-10-06 09:51:04 +02:00
Andreas Kling
d652794862 LibCore: Implement LocalSocket send_fd() and receive_fd() on Linux
We use a combination of SCM_RIGHTS and fcntl(FD_CLOEXEC) to implement
the equivalent functionality from SerenityOS.
2022-10-06 09:51:04 +02:00
sin-ack
a192095594 LibCore: Rewrite Core::Stream::read_all_impl
The previous version relied on manually setting the amount of data to
read for the next chunk and was overall unclear. The new version uses
the Bytes API to vastly improve readability, and fixes a bug where
reading from files where a single read that wasn't of equal size to the
block size would cause the byte buffer to be incorrectly resized causing
corrupted output.
2022-09-15 12:01:16 +02:00
sin-ack
d3979b0bbd LibCore: Add documentation to Stream functions + make parameter clearer
file_size was not very clear about what it was being used for, so I
switched it to say expected_file_size to make it clear that it's just a
heuristic.
2022-09-15 12:01:16 +02:00
demostanis
1c5f6003d7 LibCore: Add File::open_file_or_standard_stream() 2022-09-09 14:11:52 +01:00
sin-ack
3f3f45580a Everywhere: Add sv suffix to strings relying on StringView(char const*)
Each of these strings would previously rely on StringView's char const*
constructor overload, which would call __builtin_strlen on the string.
Since we now have operator ""sv, we can replace these with much simpler
versions. This opens the door to being able to remove
StringView(char const*).

No functional changes.
2022-07-12 23:11:35 +02:00
sin-ack
e5f09ea170 Everywhere: Split Error::from_string_literal and Error::from_string_view
Error::from_string_literal now takes direct char const*s, while
Error::from_string_view does what Error::from_string_literal used to do:
taking StringViews. This change will remove the need to insert `sv`
after error strings when returning string literal errors once
StringView(char const*) is removed.

No functional changes.
2022-07-12 23:11:35 +02:00
kleines Filmröllchen
69218b92a5 LibCore+Userland: Use StringViews when calling Core::System::open
For some reason we used raw char pointers sometimes, which caused at
least one heap buffer overflow detected in fuzzing.
2022-07-09 09:25:20 +01:00
Lucas CHOLLET
e432a284d7 LibCore: Avoid some successive allocations in Stream::read_all()
For the general case, allocations will always have the size of a block.
In case of a smaller read a block will be filled entirely before another
allocation appends.

It also adds a specialization for Stream::File::read_all() that tries to
detect the size of the file with fstat to perform a single allocation.
2022-06-27 20:22:15 +01:00
Michiel Visser
68772463cb LibCore: Add Stream::read_all() 2022-05-21 22:41:40 +02:00
Ariel Don
244357472a LibCore: Add Core::Stream::File::exists() 2022-05-21 18:15:00 +02:00
Sam Atkins
fe5fdb200b LibCore+LibIPC: Make Core::Stream read_without_waiting() return Bytes
For the reasoning, see the earlier commit about Core::Stream::read().
2022-04-16 13:27:51 -04:00
Sam Atkins
3b1e063d30 LibCore+Everywhere: Make Core::Stream::read() return Bytes
A mistake I've repeatedly made is along these lines:
```c++
auto nread = TRY(source_file->read(buffer));
TRY(destination_file->write(buffer));
```

It's a little clunky to have to create a Bytes or StringView from the
buffer's data pointer and the nread, and easy to forget and just use
the buffer. So, this patch changes the read() function to return a
Bytes of the data that were just read.

The other read_foo() methods will be modified in the same way in
subsequent commits.

Fixes #13687
2022-04-16 13:27:51 -04:00
kleines Filmröllchen
1b67e19bd6 LibCore: Extract Stream::OpenMode conversion helper into static function 2022-04-11 00:08:48 +02:00
Isak Holmstrom
41765895a8 LibCore: Make FreeBSD build SerenityOS 2022-02-17 09:26:56 +00:00
Sam Atkins
4d5080388a LibCore+Tests: Add SeekableStream::truncate() 2022-02-16 19:49:41 -05:00
sin-ack
17d3592cab LibCore: Add a timeout option to UDPSocket::connect
This allows us to set a timeout during connection and during receive and
send operations. I didn't add this to the other connect calls as it's
not used anywhere else for the time being.
2022-02-14 11:44:09 +01:00
Ali Mohammad Pur
07f444439c LibCore: Take StringViews by value in Stream::* function arguments 2022-02-06 13:10:10 +01:00
sin-ack
259ed04087 LibCore: Implement LocalSocket::release_fd
release_fd() releases the fd associated with the LocalSocket it is
called on. This is analogous to release_value() on container objects in
AK, after which the object does not contain the value.
2022-02-06 10:28:19 +01:00
sin-ack
3de51a4b99 LibCore: Make sockets close-on-exec by default
This mirrors the previous default in Core::LocalSocket, and is the safer
default anyway. This prevents fds from living on in other processes when
exec() is called in certain programs such as Assistant.

Fixes #12029.
2022-01-21 15:21:52 +01:00
sin-ack
ab36fb7a23 LibCore: Use Core::System and Error::from_syscall in Stream classes
This makes what caused a failure more obvious.
The use of Core::System additionally allows us to remove a lot of
boilerplate code from Stream classes.
2022-01-20 10:40:51 +01:00
sin-ack
4d2e3de94c LibCore: Don't manually close the fd when connection fails in sockets
This is wrong because we have already set the fd in the
PosixSocketHelper, and the destructor of the respective Socket class
will close the fd for us. With the manual closing of the fd, we attempt
to close the same fd twice which results in a crash.

Thanks to stelar7 for noticing this bug.
2022-01-20 10:40:51 +01:00
sin-ack
4cad0dd74c LibCore: Implement LocalSocket::peer_pid
Mostly a copy of Core::LocalSocket::peer_pid.
2022-01-15 13:29:48 +03:30
sin-ack
92be52fd9f LibCore: Implement LocalSocket::adopt_fd
Similar to File::adopt_fd, this function creates a new LocalSocket with
an existing fd. The main use of this function is to create LocalSocket
objects from fds that have been passed to us by SystemServer to take
over.
2022-01-15 13:29:48 +03:30
sin-ack
27b49a60d0 LibCore: Implement LocalSocket::read_without_waiting
This uses recv with MSG_DONTWAIT to disable blocking operation for a
single call. LibIPC uses this to read in a non-blocking manner from an
otherwise blocking socket.
2022-01-15 13:29:48 +03:30
sin-ack
f9847372f3 LibCore: Implement LocalSocket::receive_fd and send_fd
These are just wrappers over the sendfd and recvfd syscalls.
2022-01-15 13:29:48 +03:30
sin-ack
5f645e84d8 LibCore: Use Error::from_errno in Stream APIs
This makes Stream APIs work with Lagom and is overall cleaner.
2022-01-13 15:16:12 +03:30
sin-ack
dbd25916a3 LibCore+Userland+Tests: Convert Stream APIs to construct on heap
As per previous discussion, it was decided that the Stream classes
should be constructed on the heap.

While I don't personally agree with this change, it does have the
benefit of avoiding Function object reconstructions due to the lambda
passed to Notifier pointing to a stale object reference. This also has
the benefit of not having to "box" objects for virtual usage, as the
objects come pre-boxed.

However, it means that we now hit the heap everytime we construct a
TCPSocket for instance, which might not be desirable.
2022-01-13 15:16:12 +03:30
sin-ack
eb389db92c LibCore: Remove the SocketError class
SocketError is a relic from the KResult days when we couldn't have a
string in the KResult type, only an errno. Now that we can use string
literals with Error, it's no longer necessary. gai_strerror is thread
safe, so we can use it here unlike strerror.
2022-01-13 15:16:12 +03:30
sin-ack
19e13117ad LibCore: Implement the Serenity Stream API classes
The Serenity Stream API is the name for the new set of classes intended
to replace IODevice and its descendants. It provides more flexibility
for subclasses by allowing each subclass to override all the possible
functionalities according to their wishes.

Stream is the base class which implements majority of the functionality
expected from a readable and writable stream. SeekableStream adds
seeking on top, and provides a couple utility methods which derive from
seek. Socket adds a couple of BSD socket utility functions such as
checking whether there is data available to read and checking the
pending bytes on the socket.

As for the concrete classes, there is File which is a SeekableStream and
is intended to operate on file-like objects; and TCPSocket, UDPSocket
and LocalSocket, which handle TCP, UDP and UNIX sockets respectively.

The concrete classes do not do buffering by default. For buffering
functionality, a set of augmentative classes named BufferedSeekable and
BufferedSocket have been implemented, intended to wrap a SeekableStream
and a Socket, respectively.
2021-12-16 22:21:35 +03:30