Module Name: src Committed By: riastradh Date: Sat May 21 20:38:34 UTC 2022
Modified Files: src/tests/crypto/opencrypto: h_ioctl.c Log Message: tests/crypto/opencrypto: Wait a bit for async results. These may not be ready immediately. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/crypto/opencrypto/h_ioctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/crypto/opencrypto/h_ioctl.c diff -u src/tests/crypto/opencrypto/h_ioctl.c:1.4 src/tests/crypto/opencrypto/h_ioctl.c:1.5 --- src/tests/crypto/opencrypto/h_ioctl.c:1.4 Sat May 21 13:31:29 2022 +++ src/tests/crypto/opencrypto/h_ioctl.c Sat May 21 20:38:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: h_ioctl.c,v 1.4 2022/05/21 13:31:29 riastradh Exp $ */ +/* $NetBSD: h_ioctl.c,v 1.5 2022/05/21 20:38:34 riastradh Exp $ */ /*- * Copyright (c) 2017 Internet Initiative Japan Inc. @@ -29,6 +29,7 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <poll.h> #include <stdio.h> #include <string.h> @@ -59,6 +60,30 @@ unsigned char aes_cipher[AES_CIPHER_LEN] #define COUNT 2 +static int +wait_for_read(int fd) +{ + struct pollfd pfd = { .fd = fd, .events = POLLIN }; + int nfd; + + nfd = poll(&pfd, 1, 5000); + if (nfd == -1) { + warn("failed: poll"); + return -1; + } + if (nfd == 0) { + warnx("failed: timeout"); + errno = ETIMEDOUT; + return -1; + } + if (nfd != 1 || (pfd.revents & POLLIN) == 0) { + warnx("failed: invalid poll: %d", nfd); + errno = EIO; + return -1; + } + return 0; +} + /* * CRIOGET is deprecated. */ @@ -190,8 +215,10 @@ test_ncryptretm(int fd) mop.count = COUNT; mop.reqs = cnos; ret = ioctl(fd, CIOCNCRYPTM, &mop); - if (ret < 0) + if (ret < 0) { warn("failed: CIOCNCRYPTM"); + return ret; + } for (size_t i = 0; i < COUNT; i++) { struct crypt_result *cr = &crs[i]; @@ -204,8 +231,24 @@ test_ncryptretm(int fd) cret.count = COUNT; cret.results = crs; ret = ioctl(fd, CIOCNCRYPTRETM, &cret); - if (ret < 0) - warn("failed: CIOCNCRYPTRETM"); + if (ret < 0) { + if (errno != EINPROGRESS) { + warn("failed: CIOCNCRYPTRETM"); + return ret; + } + + ret = wait_for_read(fd); + if (ret < 0) + return ret; + + cret.count = COUNT; + cret.results = crs; + ret = ioctl(fd, CIOCNCRYPTRETM, &cret); + if (ret < 0) { + warn("failed: CIOCNCRYPTRET"); + return ret; + } + } return ret; } @@ -269,15 +312,31 @@ test_ncryptret_ent(int fd) mop.count = 1; mop.reqs = &cno; ret = ioctl(fd, CIOCNCRYPTM, &mop); - if (ret < 0) + if (ret < 0) { warn("failed: CIOCNCRYPTM"); + return ret; + } memset(&cr, 0, sizeof(cr)); cr.reqid = cno.reqid; ret = ioctl(fd, CIOCNCRYPTRET, &cr); - if (ret < 0) - warn("failed: CIOCNCRYPTRET"); + if (ret < 0) { + if (errno != EINPROGRESS) { + warn("failed: CIOCNCRYPTRET"); + return ret; + } + + ret = wait_for_read(fd); + if (ret < 0) + return ret; + ret = ioctl(fd, CIOCNCRYPTRET, &cr); + if (ret < 0) { + warn("failed: CIOCNCRYPTRET"); + return ret; + } + return 0; + } return ret; }