|
5 | 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
6 | 6 | //
|
7 | 7 | //===----------------------------------------------------------------------===//
|
8 |
| - |
9 | 8 | #include "src/errno/libc_errno.h"
|
| 9 | +#include "src/fcntl/open.h" |
10 | 10 | #include "src/sys/ioctl/ioctl.h"
|
| 11 | +#include "src/unistd/close.h" |
| 12 | +#include "src/unistd/read.h" |
11 | 13 | #include "test/UnitTest/ErrnoSetterMatcher.h"
|
| 14 | + |
12 | 15 | #include <sys/ioctl.h>
|
13 | 16 |
|
14 | 17 | using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
|
15 | 18 | using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
|
16 | 19 |
|
17 |
| -TEST(LlvmLibcSysIoctlTest, StdinFIONREAD) { |
| 20 | +TEST(LlvmLibcSysIoctlTest, NullAndTestFileFIONREAD) { |
18 | 21 | LIBC_NAMESPACE::libc_errno = 0;
|
19 | 22 |
|
20 |
| - // FIONREAD reports the number of readable bytes for fd |
21 |
| - int bytes; |
22 |
| - int ret = LIBC_NAMESPACE::ioctl(0, FIONREAD, &bytes); |
| 23 | + // FIONREAD reports the number of available bytes to read for the passed fd |
| 24 | + int dev_zero_fd = LIBC_NAMESPACE::open("/dev/zero", O_RDONLY); |
| 25 | + ASSERT_GT(dev_zero_fd, 0); |
| 26 | + ASSERT_ERRNO_SUCCESS(); |
| 27 | + |
| 28 | + // For /dev/zero, this is always 0 |
| 29 | + int dev_zero_n = -1; |
| 30 | + int ret = LIBC_NAMESPACE::ioctl(dev_zero_fd, FIONREAD, &dev_zero_n); |
| 31 | + ASSERT_GT(ret, -1); |
| 32 | + ASSERT_ERRNO_SUCCESS(); |
| 33 | + ASSERT_EQ(dev_zero_n, 0); |
| 34 | + |
| 35 | + ASSERT_THAT(LIBC_NAMESPACE::close(dev_zero_fd), Succeeds(0)); |
| 36 | + |
| 37 | + // Now, with a file known to have a non-zero size |
| 38 | + constexpr const char TEST_MSG[] = "ioctl test"; |
| 39 | + constexpr ssize_t TEST_MSG_SIZE = sizeof(TEST_MSG) - 1; |
| 40 | + constexpr const char *TEST_FILE = "testdata/ioctl.test"; |
| 41 | + int test_file_fd = LIBC_NAMESPACE::open(TEST_FILE, O_RDONLY); |
| 42 | + ASSERT_GT(test_file_fd, 0); |
| 43 | + ASSERT_ERRNO_SUCCESS(); |
| 44 | + |
| 45 | + // This reports the full size of the file, as we haven't read anything yet |
| 46 | + int test_file_n = -1; |
| 47 | + ret = LIBC_NAMESPACE::ioctl(test_file_fd, FIONREAD, &test_file_n); |
| 48 | + ASSERT_GT(ret, -1); |
| 49 | + ASSERT_ERRNO_SUCCESS(); |
| 50 | + ASSERT_EQ(test_file_n, TEST_MSG_SIZE); |
| 51 | + |
| 52 | + // But if we read some bytes... |
| 53 | + constexpr int READ_COUNT = 5; |
| 54 | + char buffer[READ_COUNT]; |
| 55 | + ASSERT_THAT(LIBC_NAMESPACE::read(test_file_fd, buffer, READ_COUNT), |
| 56 | + Succeeds(READ_COUNT)); |
| 57 | + |
| 58 | + // ... n should have decreased by the number of bytes we've read |
| 59 | + int test_file_n_after_reading = -1; |
| 60 | + ret = |
| 61 | + LIBC_NAMESPACE::ioctl(test_file_fd, FIONREAD, &test_file_n_after_reading); |
| 62 | + ASSERT_GT(ret, -1); |
23 | 63 | ASSERT_ERRNO_SUCCESS();
|
| 64 | + ASSERT_EQ(test_file_n - READ_COUNT, test_file_n_after_reading); |
| 65 | + |
| 66 | + ASSERT_THAT(LIBC_NAMESPACE::close(test_file_fd), Succeeds(0)); |
24 | 67 | }
|
25 | 68 |
|
26 |
| -TEST(LlvmLibcSysIoctlTest, InvalidCommandENOTTY) { |
| 69 | +TEST(LlvmLibcSysIoctlTest, InvalidIoctlCommand) { |
27 | 70 | LIBC_NAMESPACE::libc_errno = 0;
|
28 | 71 |
|
| 72 | + int fd = LIBC_NAMESPACE::open("/dev/zero", O_RDONLY); |
| 73 | + ASSERT_GT(fd, 0); |
| 74 | + ASSERT_ERRNO_SUCCESS(); |
| 75 | + |
29 | 76 | // 0xDEADBEEF is just a random nonexistent command;
|
30 | 77 | // calling this should always fail with ENOTTY
|
31 |
| - int ret = LIBC_NAMESPACE::ioctl(3, 0xDEADBEEF, NULL); |
| 78 | + int ret = LIBC_NAMESPACE::ioctl(fd, 0xDEADBEEF, NULL); |
32 | 79 | ASSERT_EQ(ret, -1);
|
33 | 80 | ASSERT_ERRNO_EQ(ENOTTY);
|
| 81 | + |
| 82 | + ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0)); |
34 | 83 | }
|
0 commit comments