NetBSD Advent Calendar 2023 5日目の記事です。今日はNetBSD-10(というかNetBSD-currentで確認した)新機能を試してみようと思います。
NetBSD-10に搭載されるであろう新機能
昨日の記事で紹介した、来るべきNetBsd-10に搭載されるであろう新機能をためしてみようと思います。
# find /usr/share/man/ -type f \
| grep '\.[0-9]' \
| xargs grep -A1 'first appeared in' \
| grep '.Nx 10\.0' \
| sed -e "s/-.*$//"
...
/usr/share/man/man1/scmdctl.1
/usr/share/man/man2/getrandom.2
/usr/share/man/man2/poll.2
/usr/share/man/man2/pollts.2
/usr/share/man/man2/ppoll.2
NetBSDのソースツリーを辿ると、システムコール的には getrandom(2)
と ppoll(2)
が新たに追加されているようです。
getrandom(2)
getrandom(2)はLinux 3.17で追加された機能ですが、これが新たにNetBSD-10で利用できるようです。サンプルコードは以下になります。
#include <sys/random.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
uint8_t secretkey[32];
ssize_t ret;
ret = getrandom(secretkey, sizeof(secretkey), GRND_RANDOM);
if (ret == -1) {
err(EXIT_FAILURE, "getrandom");
}
for (int i = 0; i < sizeof(secretkey); i++) {
printf("%02x:", secretkey[i]);
}
putchar('\n');
exit(EXIT_SUCCESS);
}
実行結果は以下になります。
:c5:64:66:d1:65:38:d9:32:fb:60:ea:0e:3e:79:77:40:07:4b:76:4d:77:35:
pploll(2)も追加されました
ppoll(2)も追加されています。サンプルコードは以下になります。どうやら ppoll(2)
はLinux独自のシステムコールのようで今回新たにNetBSDに追加されたシステムコールのようです。
#include <err.h>
#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
struct pollfd fds[1];
struct timespec timeout = {0, 0};
int r, len;
char buf[BUFSIZ];
fds[0].fd = fileno(stdin);
fds[0].events = POLLRDNORM;
fds[0].revents = 0;
while ((r = ppoll(fds, 1, &timeout, NULL)) != -1) {
if (fds[0].revents & POLLRDNORM) {
len = read(fds[0].fd, buf, sizeof(buf));
puts(buf);
}
}
exit(EXIT_SUCCESS);
}
まとめ
来るべきNetBSD-10に搭載される機能を調べてみました。 getrandom(2)
や ppoll(2)
といった、Linuxのシステムコールとの互換性を保つ機能が追加されているようです。BSDユーザ個人としては、それが良いことなのかどうなのかは判断しかねますが…😖(互換性が高まるのはよいことではあります…)。