On Wed, 28 Sep 2022, at 15:07:41 -0000 (UTC), Christos Zoulas wrote:
In article <20220928003547.D2375FA92%cvs.NetBSD.org@localhost>,
David H. Gutteridge <source-changes-d%NetBSD.org@localhost> wrote:
-=-=-=-=-=-

Module Name:    src
Committed By:   gutteridge
Date:           Wed Sep 28 00:35:47 UTC 2022

Modified Files:
        src/lib/libc/stdlib: posix_openpt.3

Log Message:
posix_openpt.3: reflect flag changes from r. 1.44 of tty_ptm.c

Some flags are now accepted, others are still ignored. (E.g., other
BSDs would return EINVAL if O_RDWR wasn't passed, and we now accept
O_NONBLOCK but not O_CLOEXEC.)

How so?

#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FDSYNC|FRSYNC|FALTIO|\
                                              ^^^^^^^^^
                        FDIRECT|FNOSIGPIPE)
/* bits to save after open(2) */
#define FMASK           (FREAD|FWRITE|FCNTLFLAGS|FEXEC)
                                     ^^^^^^^^^^

Best,

christos

Hi Christos,

I'm sorry, I don't follow your question? I wrote "we now accept
O_NONBLOCK...", which is what I'm reading you're saying too?

(O_CLOEXEC, on the other hand, is ignored, at the moment.)

$ cat open_test.c
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
        int fd, flags;

        printf("Regular file (read-only) with O_NONBLOCK | O_CLOEXEC.\n");
        if ((fd = open("/etc/release", O_RDONLY | O_NONBLOCK | O_CLOEXEC)) < 0)
                printf("Failed to get file handle.\n");
        else {
                printf("Descriptor flags: %d\n", flags = fcntl(fd, F_GETFD));
                printf("Status flags: %d\n", flags = fcntl(fd, F_GETFL, 0));
                close(fd);
        }

        printf("POSIX pt cloning device with O_NONBLOCK | O_CLOEXEC.\n");
if ((fd = open("/dev/ptmx", O_RDWR | O_NOCTTY | O_NONBLOCK | O_CLOEXEC)) < 0)
                printf("Failed to open /dev/ptmx.\n");
        else {
                printf("Descriptor flags: %d\n", flags = fcntl(fd, F_GETFD));
                printf("Status flags: %d\n", flags = fcntl(fd, F_GETFL, 0));
                close(fd);
        }

        return 0;
}

$ ./open_test
Regular file (read-only) with O_NONBLOCK | O_CLOEXEC.
Descriptor flags: 1
Status flags: 4
POSIX pt cloning device with O_NONBLOCK | O_CLOEXEC.
Descriptor flags: 0
Status flags: 6

Regards,

Dave

Reply via email to