1*3f1f48f1SPeter Holm#!/bin/sh 2*3f1f48f1SPeter Holm 3*3f1f48f1SPeter Holm# 4*3f1f48f1SPeter Holm# SPDX-License-Identifier: BSD-2-Clause 5*3f1f48f1SPeter Holm# 6*3f1f48f1SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org> 7*3f1f48f1SPeter Holm# 8*3f1f48f1SPeter Holm# Redistribution and use in source and binary forms, with or without 9*3f1f48f1SPeter Holm# modification, are permitted provided that the following conditions 10*3f1f48f1SPeter Holm# are met: 11*3f1f48f1SPeter Holm# 1. Redistributions of source code must retain the above copyright 12*3f1f48f1SPeter Holm# notice, this list of conditions and the following disclaimer. 13*3f1f48f1SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 14*3f1f48f1SPeter Holm# notice, this list of conditions and the following disclaimer in the 15*3f1f48f1SPeter Holm# documentation and/or other materials provided with the distribution. 16*3f1f48f1SPeter Holm# 17*3f1f48f1SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*3f1f48f1SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*3f1f48f1SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*3f1f48f1SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*3f1f48f1SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*3f1f48f1SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*3f1f48f1SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*3f1f48f1SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*3f1f48f1SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*3f1f48f1SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*3f1f48f1SPeter Holm# SUCH DAMAGE. 28*3f1f48f1SPeter Holm# 29*3f1f48f1SPeter Holm 30*3f1f48f1SPeter Holm# D38549: msdosfs deextend: validate pages of the partial buffer 31*3f1f48f1SPeter Holm 32*3f1f48f1SPeter Holm# https://people.freebsd.org/~pho/stress/log/log0420.txt 33*3f1f48f1SPeter Holm 34*3f1f48f1SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 35*3f1f48f1SPeter Holm 36*3f1f48f1SPeter Holm. ../default.cfg 37*3f1f48f1SPeter Holm 38*3f1f48f1SPeter Holmset -eu 39*3f1f48f1SPeter Holmprog=$(basename "$0" .sh) 40*3f1f48f1SPeter Holmmkdir -p $mntpoint 41*3f1f48f1SPeter Holmmount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint 42*3f1f48f1SPeter Holm[ -c /dev/md$mdstart ] && mdconfig -d -u $mdstart 43*3f1f48f1SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart 44*3f1f48f1SPeter Holmnewfs_msdos /dev/md$mdstart > /dev/null 2>&1 45*3f1f48f1SPeter Holmmount -t msdosfs /dev/md$mdstart $mntpoint 46*3f1f48f1SPeter Holmmount | grep $mntpoint 47*3f1f48f1SPeter Holmset +e 48*3f1f48f1SPeter Holm 49*3f1f48f1SPeter Holmodir=`pwd` 50*3f1f48f1SPeter Holm 51*3f1f48f1SPeter Holmcd /tmp 52*3f1f48f1SPeter Holmsed '1,/^EOF/d' < $odir/$0 > $prog.c 53*3f1f48f1SPeter Holmcc -o $prog -Wall -O0 $prog.c -pthread || exit 1 54*3f1f48f1SPeter Holmrm -f $prog.c 55*3f1f48f1SPeter Holmcd $mntpoint 56*3f1f48f1SPeter Holm 57*3f1f48f1SPeter Holmin=inputFile 58*3f1f48f1SPeter Holmout=outputFile 59*3f1f48f1SPeter Holm 60*3f1f48f1SPeter Holm/tmp/$prog $in $out 12345 61*3f1f48f1SPeter Holmls -al 62*3f1f48f1SPeter Holm 63*3f1f48f1SPeter Holmcd $odir 64*3f1f48f1SPeter Holmumount $mntpoint 65*3f1f48f1SPeter Holmmdconfig -d -u $mdstart 66*3f1f48f1SPeter Holmrm -f /tmp/$prog 67*3f1f48f1SPeter Holmexit 68*3f1f48f1SPeter HolmEOF 69*3f1f48f1SPeter Holm#include <sys/param.h> 70*3f1f48f1SPeter Holm#include <sys/socket.h> 71*3f1f48f1SPeter Holm#include <sys/stat.h> 72*3f1f48f1SPeter Holm#include <sys/wait.h> 73*3f1f48f1SPeter Holm 74*3f1f48f1SPeter Holm#include <err.h> 75*3f1f48f1SPeter Holm#include <fcntl.h> 76*3f1f48f1SPeter Holm#include <netdb.h> 77*3f1f48f1SPeter Holm#include <netinet/in.h> 78*3f1f48f1SPeter Holm#include <pthread.h> 79*3f1f48f1SPeter Holm#include <pthread_np.h> 80*3f1f48f1SPeter Holm#include <signal.h> 81*3f1f48f1SPeter Holm#include <stdio.h> 82*3f1f48f1SPeter Holm#include <stdlib.h> 83*3f1f48f1SPeter Holm#include <string.h> 84*3f1f48f1SPeter Holm#include <time.h> 85*3f1f48f1SPeter Holm#include <unistd.h> 86*3f1f48f1SPeter Holm 87*3f1f48f1SPeter Holmint fd, port; 88*3f1f48f1SPeter Holmvolatile int go; 89*3f1f48f1SPeter Holmchar *inputFile; 90*3f1f48f1SPeter Holmchar *outputFile; 91*3f1f48f1SPeter Holm 92*3f1f48f1SPeter Holm#define FSIZE 936374 93*3f1f48f1SPeter Holmchar buf[FSIZE]; 94*3f1f48f1SPeter Holm 95*3f1f48f1SPeter Holmstatic void 96*3f1f48f1SPeter Holmreader(void) { 97*3f1f48f1SPeter Holm struct sockaddr_in inetaddr, inetpeer; 98*3f1f48f1SPeter Holm socklen_t len; 99*3f1f48f1SPeter Holm int on, n, tcpsock, msgsock; 100*3f1f48f1SPeter Holm 101*3f1f48f1SPeter Holm on = 1; 102*3f1f48f1SPeter Holm if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 103*3f1f48f1SPeter Holm err(1, "socket(), %s:%d", __FILE__, __LINE__); 104*3f1f48f1SPeter Holm 105*3f1f48f1SPeter Holm if (setsockopt(tcpsock, 106*3f1f48f1SPeter Holm SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 107*3f1f48f1SPeter Holm err(1, "setsockopt(), %s:%d", __FILE__, __LINE__); 108*3f1f48f1SPeter Holm 109*3f1f48f1SPeter Holm inetaddr.sin_family = AF_INET; 110*3f1f48f1SPeter Holm inetaddr.sin_addr.s_addr = INADDR_ANY; 111*3f1f48f1SPeter Holm inetaddr.sin_port = htons(port); 112*3f1f48f1SPeter Holm inetaddr.sin_len = sizeof(inetaddr); 113*3f1f48f1SPeter Holm 114*3f1f48f1SPeter Holm if (bind(tcpsock, 115*3f1f48f1SPeter Holm (struct sockaddr *)&inetaddr, sizeof (inetaddr)) < 0) 116*3f1f48f1SPeter Holm err(1, "bind(), %s:%d", __FILE__, __LINE__); 117*3f1f48f1SPeter Holm 118*3f1f48f1SPeter Holm if (listen(tcpsock, 5) < 0) 119*3f1f48f1SPeter Holm err(1, "listen(), %s:%d", __FILE__, __LINE__); 120*3f1f48f1SPeter Holm 121*3f1f48f1SPeter Holm len = sizeof(inetpeer); 122*3f1f48f1SPeter Holm if ((msgsock = accept(tcpsock, 123*3f1f48f1SPeter Holm (struct sockaddr *)&inetpeer, &len)) < 0) 124*3f1f48f1SPeter Holm err(1, "accept(), %s:%d", __FILE__, __LINE__); 125*3f1f48f1SPeter Holm 126*3f1f48f1SPeter Holm if ((fd = open(outputFile, O_RDWR | O_CREAT | O_TRUNC, 0640)) == -1) 127*3f1f48f1SPeter Holm err(1, "open(%s)", outputFile); 128*3f1f48f1SPeter Holm 129*3f1f48f1SPeter Holm usleep(arc4random() % 1000); 130*3f1f48f1SPeter Holm for (;;) { 131*3f1f48f1SPeter Holm if ((n = read(msgsock, buf, FSIZE)) < 0) 132*3f1f48f1SPeter Holm err(1, "read(), %s:%d", __FILE__, __LINE__); 133*3f1f48f1SPeter Holm if (n == 0) 134*3f1f48f1SPeter Holm break; 135*3f1f48f1SPeter Holm 136*3f1f48f1SPeter Holm } 137*3f1f48f1SPeter Holm close(msgsock); 138*3f1f48f1SPeter Holm close(tcpsock); 139*3f1f48f1SPeter Holm close(fd); 140*3f1f48f1SPeter Holm return; 141*3f1f48f1SPeter Holm} 142*3f1f48f1SPeter Holm 143*3f1f48f1SPeter Holmstatic void * 144*3f1f48f1SPeter Holmthr(void *data __unused) 145*3f1f48f1SPeter Holm{ 146*3f1f48f1SPeter Holm pthread_set_name_np(pthread_self(), __func__); 147*3f1f48f1SPeter Holm go = 1; 148*3f1f48f1SPeter Holm while (go == 1) { 149*3f1f48f1SPeter Holm ftruncate(fd, FSIZE / 2); 150*3f1f48f1SPeter Holm ftruncate(fd, FSIZE); 151*3f1f48f1SPeter Holm } 152*3f1f48f1SPeter Holm 153*3f1f48f1SPeter Holm return (NULL); 154*3f1f48f1SPeter Holm} 155*3f1f48f1SPeter Holm 156*3f1f48f1SPeter Holmstatic void 157*3f1f48f1SPeter Holmwriter(void) { 158*3f1f48f1SPeter Holm struct hostent *hostent; 159*3f1f48f1SPeter Holm struct sockaddr_in inetaddr; 160*3f1f48f1SPeter Holm pthread_t tid; 161*3f1f48f1SPeter Holm off_t off = 0; 162*3f1f48f1SPeter Holm size_t size; 163*3f1f48f1SPeter Holm int i, on, r, tcpsock; 164*3f1f48f1SPeter Holm 165*3f1f48f1SPeter Holm on = 1; 166*3f1f48f1SPeter Holm for (i = 1; i < 5; i++) { 167*3f1f48f1SPeter Holm if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 168*3f1f48f1SPeter Holm err(1, "socket(), %s:%d", __FILE__, __LINE__); 169*3f1f48f1SPeter Holm 170*3f1f48f1SPeter Holm if (setsockopt(tcpsock, 171*3f1f48f1SPeter Holm SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 172*3f1f48f1SPeter Holm err(1, "setsockopt(), %s:%d", __FILE__, __LINE__); 173*3f1f48f1SPeter Holm 174*3f1f48f1SPeter Holm size = getpagesize(); 175*3f1f48f1SPeter Holm if (setsockopt(tcpsock, SOL_SOCKET, SO_SNDBUF, (void *)&size, 176*3f1f48f1SPeter Holm sizeof(size)) < 0) 177*3f1f48f1SPeter Holm err(1, "setsockopt(SO_SNDBUF), %s:%d", 178*3f1f48f1SPeter Holm __FILE__, __LINE__); 179*3f1f48f1SPeter Holm 180*3f1f48f1SPeter Holm hostent = gethostbyname ("localhost"); 181*3f1f48f1SPeter Holm memcpy (&inetaddr.sin_addr.s_addr, hostent->h_addr, 182*3f1f48f1SPeter Holm sizeof (struct in_addr)); 183*3f1f48f1SPeter Holm 184*3f1f48f1SPeter Holm inetaddr.sin_family = AF_INET; 185*3f1f48f1SPeter Holm inetaddr.sin_port = htons(port); 186*3f1f48f1SPeter Holm inetaddr.sin_len = sizeof(inetaddr); 187*3f1f48f1SPeter Holm 188*3f1f48f1SPeter Holm r = connect(tcpsock, (struct sockaddr *) &inetaddr, 189*3f1f48f1SPeter Holm sizeof(inetaddr)); 190*3f1f48f1SPeter Holm if (r == 0) 191*3f1f48f1SPeter Holm break; 192*3f1f48f1SPeter Holm sleep(1); 193*3f1f48f1SPeter Holm close(tcpsock); 194*3f1f48f1SPeter Holm } 195*3f1f48f1SPeter Holm if (r < 0) 196*3f1f48f1SPeter Holm err(1, "connect(), %s:%d", __FILE__, __LINE__); 197*3f1f48f1SPeter Holm 198*3f1f48f1SPeter Holm if ((fd = open(inputFile, O_RDWR | O_CREAT | O_TRUNC, 0640)) == -1) 199*3f1f48f1SPeter Holm err(1, "open(%s)", inputFile); 200*3f1f48f1SPeter Holm 201*3f1f48f1SPeter Holm if (write(fd, buf, sizeof(buf)) != sizeof(buf)) 202*3f1f48f1SPeter Holm err(1, "write()"); 203*3f1f48f1SPeter Holm 204*3f1f48f1SPeter Holm r = pthread_create(&tid, NULL, thr, NULL); 205*3f1f48f1SPeter Holm if (r) 206*3f1f48f1SPeter Holm errc(1, r, "pthread_create"); 207*3f1f48f1SPeter Holm 208*3f1f48f1SPeter Holm usleep(5000); 209*3f1f48f1SPeter Holm if (sendfile(fd, tcpsock, 0, FSIZE, NULL, &off, 0) == -1) 210*3f1f48f1SPeter Holm err(1, "sendfile"); 211*3f1f48f1SPeter Holm 212*3f1f48f1SPeter Holm usleep(arc4random() % 20000); 213*3f1f48f1SPeter Holm go = 0; 214*3f1f48f1SPeter Holm if ((r = pthread_join(tid, NULL)) != 0) 215*3f1f48f1SPeter Holm errc(1, r, "pthread_join"); 216*3f1f48f1SPeter Holm 217*3f1f48f1SPeter Holm _exit(0); 218*3f1f48f1SPeter Holm} 219*3f1f48f1SPeter Holm 220*3f1f48f1SPeter Holmint 221*3f1f48f1SPeter Holmmain(int argc, char **argv) 222*3f1f48f1SPeter Holm{ 223*3f1f48f1SPeter Holm pid_t pid; 224*3f1f48f1SPeter Holm time_t start; 225*3f1f48f1SPeter Holm 226*3f1f48f1SPeter Holm if (argc != 4) { 227*3f1f48f1SPeter Holm fprintf(stderr, "Usage: %s <inputFile outputFile portNumber\n", 228*3f1f48f1SPeter Holm argv[0]); 229*3f1f48f1SPeter Holm return (1); 230*3f1f48f1SPeter Holm } 231*3f1f48f1SPeter Holm inputFile = argv[1]; 232*3f1f48f1SPeter Holm outputFile = argv[2]; 233*3f1f48f1SPeter Holm port = atoi(argv[3]); 234*3f1f48f1SPeter Holm pthread_set_name_np(pthread_self(), __func__); 235*3f1f48f1SPeter Holm 236*3f1f48f1SPeter Holm start = time(NULL); 237*3f1f48f1SPeter Holm while (time(NULL) - start < 120) { 238*3f1f48f1SPeter Holm if ((pid = fork()) == 0) { 239*3f1f48f1SPeter Holm writer(); 240*3f1f48f1SPeter Holm } else if (pid > 0) { 241*3f1f48f1SPeter Holm reader(); 242*3f1f48f1SPeter Holm kill(pid, SIGINT); 243*3f1f48f1SPeter Holm if (waitpid(pid, NULL, 0) != pid) 244*3f1f48f1SPeter Holm err(1, "waitpid()"); 245*3f1f48f1SPeter Holm } else 246*3f1f48f1SPeter Holm err(1, "fork(), %s:%d", __FILE__, __LINE__); 247*3f1f48f1SPeter Holm } 248*3f1f48f1SPeter Holm 249*3f1f48f1SPeter Holm return (0); 250*3f1f48f1SPeter Holm} 251