sblock.c (256281) | sblock.c (281974) |
---|---|
1/*- 2 * Copyright (c) 2007 Robert N. M. Watson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 2007 Robert N. M. Watson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $FreeBSD: stable/10/tools/regression/sockets/sblock/sblock.c 243313 2012-11-19 22:53:57Z emaste $ | 26 * $FreeBSD: stable/10/tools/regression/sockets/sblock/sblock.c 281974 2015-04-25 05:31:52Z ngie $ |
27 */ 28 29/* 30 * Sockets serialize I/O in each direction in order to avoid interlacing of 31 * I/O by multiple processes or threcvs recving or sending the socket. This 32 * is done using some form of kernel lock (varies by kernel version), called 33 * "sblock" in FreeBSD. However, to avoid unkillable processes waiting on 34 * I/O that may be entirely controlled by a remote network endpoint, that --- 14 unchanged lines hidden (view full) --- 49#include <errno.h> 50#include <signal.h> 51#include <stdio.h> 52#include <stdlib.h> 53#include <unistd.h> 54 55static int interrupted; 56static void | 27 */ 28 29/* 30 * Sockets serialize I/O in each direction in order to avoid interlacing of 31 * I/O by multiple processes or threcvs recving or sending the socket. This 32 * is done using some form of kernel lock (varies by kernel version), called 33 * "sblock" in FreeBSD. However, to avoid unkillable processes waiting on 34 * I/O that may be entirely controlled by a remote network endpoint, that --- 14 unchanged lines hidden (view full) --- 49#include <errno.h> 50#include <signal.h> 51#include <stdio.h> 52#include <stdlib.h> 53#include <unistd.h> 54 55static int interrupted; 56static void |
57signal_handler(int signum) | 57signal_handler(int signum __unused) |
58{ 59 60 interrupted++; 61} 62 63/* 64 * Process that will perform a blocking recv on a UNIX domain socket. This 65 * should return one byte of data. --- 24 unchanged lines hidden (view full) --- 90 * succeeded, we get EINTR as the signal interrupts the lock request. 91 */ 92static void 93locking_recver(int fd) 94{ 95 ssize_t len; 96 char ch; 97 | 58{ 59 60 interrupted++; 61} 62 63/* 64 * Process that will perform a blocking recv on a UNIX domain socket. This 65 * should return one byte of data. --- 24 unchanged lines hidden (view full) --- 90 * succeeded, we get EINTR as the signal interrupts the lock request. 91 */ 92static void 93locking_recver(int fd) 94{ 95 ssize_t len; 96 char ch; 97 |
98 if (sleep(1) < 0) | 98 if (sleep(1) != 0) |
99 err(-1, "FAIL: locking_recver: sleep"); 100 len = recv(fd, &ch, sizeof(ch), 0); 101 if (len < 0 && errno != EINTR) 102 err(-1, "FAIL: locking_recver: recv"); 103 if (len < 0 && errno == EINTR) { 104 fprintf(stderr, "PASS\n"); 105 exit(0); 106 } --- 4 unchanged lines hidden (view full) --- 111} 112 113static void 114signaller(pid_t locking_recver_pid, int fd) 115{ 116 ssize_t len; 117 char ch; 118 | 99 err(-1, "FAIL: locking_recver: sleep"); 100 len = recv(fd, &ch, sizeof(ch), 0); 101 if (len < 0 && errno != EINTR) 102 err(-1, "FAIL: locking_recver: recv"); 103 if (len < 0 && errno == EINTR) { 104 fprintf(stderr, "PASS\n"); 105 exit(0); 106 } --- 4 unchanged lines hidden (view full) --- 111} 112 113static void 114signaller(pid_t locking_recver_pid, int fd) 115{ 116 ssize_t len; 117 char ch; 118 |
119 if (sleep(2) < 0) { | 119 if (sleep(2) != 0) { |
120 warn("signaller sleep(2)"); 121 return; 122 } 123 if (kill(locking_recver_pid, SIGHUP) < 0) { 124 warn("signaller kill(%d)", locking_recver_pid); 125 return; 126 } | 120 warn("signaller sleep(2)"); 121 return; 122 } 123 if (kill(locking_recver_pid, SIGHUP) < 0) { 124 warn("signaller kill(%d)", locking_recver_pid); 125 return; 126 } |
127 if (sleep(1) < 0) { | 127 if (sleep(1) != 0) { |
128 warn("signaller sleep(1)"); 129 return; 130 } 131 len = send(fd, &ch, sizeof(ch), 0); 132 if (len < 0) { 133 warn("signaller send"); 134 return; 135 } 136 if (len != sizeof(ch)) { 137 warnx("signaller send ret %zd", len); 138 return; 139 } 140 if (close(fd) < 0) { 141 warn("signaller close"); 142 return; 143 } | 128 warn("signaller sleep(1)"); 129 return; 130 } 131 len = send(fd, &ch, sizeof(ch), 0); 132 if (len < 0) { 133 warn("signaller send"); 134 return; 135 } 136 if (len != sizeof(ch)) { 137 warnx("signaller send ret %zd", len); 138 return; 139 } 140 if (close(fd) < 0) { 141 warn("signaller close"); 142 return; 143 } |
144 if (sleep(1) < 0) { | 144 if (sleep(1) != 0) { |
145 warn("signaller sleep(1)"); 146 return; 147 } 148} 149 150int | 145 warn("signaller sleep(1)"); 146 return; 147 } 148} 149 150int |
151main(int argc, char *argv[]) | 151main(void) |
152{ 153 int error, fds[2], recver_fd, sender_fd; 154 pid_t blocking_recver_pid; 155 pid_t locking_recver_pid; 156 struct sigaction sa; 157 158 if (sigaction(SIGHUP, NULL, &sa) < 0) 159 err(-1, "FAIL: sigaction(SIGHUP, NULL, &sa)"); --- 48 unchanged lines hidden --- | 152{ 153 int error, fds[2], recver_fd, sender_fd; 154 pid_t blocking_recver_pid; 155 pid_t locking_recver_pid; 156 struct sigaction sa; 157 158 if (sigaction(SIGHUP, NULL, &sa) < 0) 159 err(-1, "FAIL: sigaction(SIGHUP, NULL, &sa)"); --- 48 unchanged lines hidden --- |