]> Zhao Yanbai Git Server - minix.git/commitdiff
Fix fcntl(F_[GS]ETNOSIGPIPE) semantics 62/2862/1
authorDavid van Moolenbroek <david@minix3.org>
Sat, 1 Nov 2014 12:57:31 +0000 (12:57 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Sat, 1 Nov 2014 12:57:31 +0000 (12:57 +0000)
The new semantics should match those of NetBSD and other systems.

Change-Id: Ic9ca9d6b8c3e42d2a2953d9feea5f6bacaceb43c

minix/lib/libc/sys/fcntl.c
minix/servers/vfs/misc.c
minix/tests/test68.c

index 10b99058f7ef623cd9cd678e9fa74d44efa4110c..e6f4e67862d3fedc725e25c273fc67c7da3dd888 100644 (file)
@@ -23,6 +23,7 @@ int fcntl(int fd, int cmd, ...)
      case F_DUPFD:
      case F_SETFD:
      case F_SETFL:
+     case F_SETNOSIGPIPE:
        m.m_lc_vfs_fcntl.arg_int = va_arg(argp, int);
        break;
      case F_GETLK:
index 8652007ca5f180fea53df0592daf96c2c434190b..429244c0b1918f58ecee9d88b5a8071d0726f967 100644 (file)
@@ -214,14 +214,13 @@ int do_fcntl(void)
        break;
      }
     case F_GETNOSIGPIPE:
-       /* POSIX: return value other than -1 is flag is set, else -1 */
-       r = -1;
-       if (f->filp_flags & O_NOSIGPIPE)
-               r = 0;
+       r = !!(f->filp_flags & O_NOSIGPIPE);
        break;
     case F_SETNOSIGPIPE:
-       fl = (O_NOSIGPIPE);
-       f->filp_flags = (f->filp_flags & ~fl) | (fcntl_argx & fl);
+       if (fcntl_argx)
+               f->filp_flags |= O_NOSIGPIPE;
+       else
+               f->filp_flags &= ~O_NOSIGPIPE;
        break;
     case F_FLUSH_FS_CACHE:
     {
index 273117bce0b76114e08e3d6e4ebdbda8db09a577..99581677d6ac3abecd7cff429aa84d3ace89efc2 100644 (file)
@@ -267,8 +267,8 @@ test_pipe_flag_setting()
        if (fcntl(pipes[1], F_GETFD) != 0) e(3);
        if (fcntl(pipes[0], F_GETFL) & O_NONBLOCK) e(4);
        if (fcntl(pipes[1], F_GETFL) & O_NONBLOCK) e(5);
-       if (fcntl(pipes[0], F_GETNOSIGPIPE) != -1) e(6);
-       if (fcntl(pipes[1], F_GETNOSIGPIPE) != -1) e(7);
+       if (fcntl(pipes[0], F_GETNOSIGPIPE) != 0) e(6);
+       if (fcntl(pipes[1], F_GETNOSIGPIPE) != 0) e(7);
        if (close(pipes[0]) != 0) e(8);
        if (close(pipes[1]) != 0) e(9);
 
@@ -278,10 +278,14 @@ test_pipe_flag_setting()
        if (fcntl(pipes[1], F_GETFD) != FD_CLOEXEC) e(12);
        if (!(fcntl(pipes[0], F_GETFL) & O_NONBLOCK)) e(13);
        if (!(fcntl(pipes[1], F_GETFL) & O_NONBLOCK)) e(14);
-       if (fcntl(pipes[0], F_GETNOSIGPIPE) == -1) e(15);
-       if (fcntl(pipes[1], F_GETNOSIGPIPE) == -1) e(16);
-       if (close(pipes[0]) != 0) e(17);
-       if (close(pipes[1]) != 0) e(18);
+       if (fcntl(pipes[0], F_GETNOSIGPIPE) == 0) e(15);
+       if (fcntl(pipes[1], F_GETNOSIGPIPE) == 0) e(16);
+       if (fcntl(pipes[0], F_SETNOSIGPIPE, 0) != 0) e(17);
+       if (fcntl(pipes[0], F_GETNOSIGPIPE) != 0) e(18);
+       if (fcntl(pipes[0], F_SETNOSIGPIPE, 1) != 0) e(19);
+       if (fcntl(pipes[0], F_GETNOSIGPIPE) == 0) e(20);
+       if (close(pipes[0]) != 0) e(21);
+       if (close(pipes[1]) != 0) e(22);
 }
 
 int