xref: /freebsd/tools/test/stress2/misc/msdos18.sh (revision 3f1f48f1)
13f1f48f1SPeter Holm#!/bin/sh
23f1f48f1SPeter Holm
33f1f48f1SPeter Holm#
43f1f48f1SPeter Holm# SPDX-License-Identifier: BSD-2-Clause
53f1f48f1SPeter Holm#
63f1f48f1SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org>
73f1f48f1SPeter Holm#
83f1f48f1SPeter Holm# Redistribution and use in source and binary forms, with or without
93f1f48f1SPeter Holm# modification, are permitted provided that the following conditions
103f1f48f1SPeter Holm# are met:
113f1f48f1SPeter Holm# 1. Redistributions of source code must retain the above copyright
123f1f48f1SPeter Holm#    notice, this list of conditions and the following disclaimer.
133f1f48f1SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
143f1f48f1SPeter Holm#    notice, this list of conditions and the following disclaimer in the
153f1f48f1SPeter Holm#    documentation and/or other materials provided with the distribution.
163f1f48f1SPeter Holm#
173f1f48f1SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
183f1f48f1SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
193f1f48f1SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
203f1f48f1SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
213f1f48f1SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
223f1f48f1SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
233f1f48f1SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
243f1f48f1SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
253f1f48f1SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
263f1f48f1SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
273f1f48f1SPeter Holm# SUCH DAMAGE.
283f1f48f1SPeter Holm#
293f1f48f1SPeter Holm
303f1f48f1SPeter Holm# D38549: msdosfs deextend: validate pages of the partial buffer
313f1f48f1SPeter Holm
323f1f48f1SPeter Holm# https://people.freebsd.org/~pho/stress/log/log0420.txt
333f1f48f1SPeter Holm
343f1f48f1SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
353f1f48f1SPeter Holm
363f1f48f1SPeter Holm. ../default.cfg
373f1f48f1SPeter Holm
383f1f48f1SPeter Holmset -eu
393f1f48f1SPeter Holmprog=$(basename "$0" .sh)
403f1f48f1SPeter Holmmkdir -p $mntpoint
413f1f48f1SPeter Holmmount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint
423f1f48f1SPeter Holm[ -c /dev/md$mdstart ] &&  mdconfig -d -u $mdstart
433f1f48f1SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart
443f1f48f1SPeter Holmnewfs_msdos /dev/md$mdstart > /dev/null 2>&1
453f1f48f1SPeter Holmmount -t msdosfs /dev/md$mdstart $mntpoint
463f1f48f1SPeter Holmmount | grep $mntpoint
473f1f48f1SPeter Holmset +e
483f1f48f1SPeter Holm
493f1f48f1SPeter Holmodir=`pwd`
503f1f48f1SPeter Holm
513f1f48f1SPeter Holmcd /tmp
523f1f48f1SPeter Holmsed '1,/^EOF/d' < $odir/$0 > $prog.c
533f1f48f1SPeter Holmcc -o $prog -Wall -O0 $prog.c -pthread || exit 1
543f1f48f1SPeter Holmrm -f $prog.c
553f1f48f1SPeter Holmcd $mntpoint
563f1f48f1SPeter Holm
573f1f48f1SPeter Holmin=inputFile
583f1f48f1SPeter Holmout=outputFile
593f1f48f1SPeter Holm
603f1f48f1SPeter Holm/tmp/$prog $in $out 12345
613f1f48f1SPeter Holmls -al
623f1f48f1SPeter Holm
633f1f48f1SPeter Holmcd $odir
643f1f48f1SPeter Holmumount $mntpoint
653f1f48f1SPeter Holmmdconfig -d -u $mdstart
663f1f48f1SPeter Holmrm -f /tmp/$prog
673f1f48f1SPeter Holmexit
683f1f48f1SPeter HolmEOF
693f1f48f1SPeter Holm#include <sys/param.h>
703f1f48f1SPeter Holm#include <sys/socket.h>
713f1f48f1SPeter Holm#include <sys/stat.h>
723f1f48f1SPeter Holm#include <sys/wait.h>
733f1f48f1SPeter Holm
743f1f48f1SPeter Holm#include <err.h>
753f1f48f1SPeter Holm#include <fcntl.h>
763f1f48f1SPeter Holm#include <netdb.h>
773f1f48f1SPeter Holm#include <netinet/in.h>
783f1f48f1SPeter Holm#include <pthread.h>
793f1f48f1SPeter Holm#include <pthread_np.h>
803f1f48f1SPeter Holm#include <signal.h>
813f1f48f1SPeter Holm#include <stdio.h>
823f1f48f1SPeter Holm#include <stdlib.h>
833f1f48f1SPeter Holm#include <string.h>
843f1f48f1SPeter Holm#include <time.h>
853f1f48f1SPeter Holm#include <unistd.h>
863f1f48f1SPeter Holm
873f1f48f1SPeter Holmint fd, port;
883f1f48f1SPeter Holmvolatile int go;
893f1f48f1SPeter Holmchar *inputFile;
903f1f48f1SPeter Holmchar *outputFile;
913f1f48f1SPeter Holm
923f1f48f1SPeter Holm#define FSIZE 936374
933f1f48f1SPeter Holmchar buf[FSIZE];
943f1f48f1SPeter Holm
953f1f48f1SPeter Holmstatic void
963f1f48f1SPeter Holmreader(void) {
973f1f48f1SPeter Holm	struct sockaddr_in inetaddr, inetpeer;
983f1f48f1SPeter Holm	socklen_t len;
993f1f48f1SPeter Holm	int on, n, tcpsock, msgsock;
1003f1f48f1SPeter Holm
1013f1f48f1SPeter Holm	on = 1;
1023f1f48f1SPeter Holm	if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
1033f1f48f1SPeter Holm		err(1, "socket(), %s:%d", __FILE__, __LINE__);
1043f1f48f1SPeter Holm
1053f1f48f1SPeter Holm	if (setsockopt(tcpsock,
1063f1f48f1SPeter Holm	    SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0)
1073f1f48f1SPeter Holm		err(1, "setsockopt(), %s:%d", __FILE__, __LINE__);
1083f1f48f1SPeter Holm
1093f1f48f1SPeter Holm	inetaddr.sin_family = AF_INET;
1103f1f48f1SPeter Holm	inetaddr.sin_addr.s_addr = INADDR_ANY;
1113f1f48f1SPeter Holm	inetaddr.sin_port = htons(port);
1123f1f48f1SPeter Holm	inetaddr.sin_len = sizeof(inetaddr);
1133f1f48f1SPeter Holm
1143f1f48f1SPeter Holm	if (bind(tcpsock,
1153f1f48f1SPeter Holm	    (struct sockaddr *)&inetaddr, sizeof (inetaddr)) < 0)
1163f1f48f1SPeter Holm		err(1, "bind(), %s:%d", __FILE__, __LINE__);
1173f1f48f1SPeter Holm
1183f1f48f1SPeter Holm	if (listen(tcpsock, 5) < 0)
1193f1f48f1SPeter Holm		err(1, "listen(), %s:%d", __FILE__, __LINE__);
1203f1f48f1SPeter Holm
1213f1f48f1SPeter Holm	len = sizeof(inetpeer);
1223f1f48f1SPeter Holm	if ((msgsock = accept(tcpsock,
1233f1f48f1SPeter Holm	    (struct sockaddr *)&inetpeer, &len)) < 0)
1243f1f48f1SPeter Holm		err(1, "accept(), %s:%d", __FILE__, __LINE__);
1253f1f48f1SPeter Holm
1263f1f48f1SPeter Holm	if ((fd = open(outputFile, O_RDWR | O_CREAT | O_TRUNC, 0640)) == -1)
1273f1f48f1SPeter Holm		err(1, "open(%s)", outputFile);
1283f1f48f1SPeter Holm
1293f1f48f1SPeter Holm	usleep(arc4random() % 1000);
1303f1f48f1SPeter Holm	for (;;) {
1313f1f48f1SPeter Holm		if ((n = read(msgsock, buf, FSIZE)) < 0)
1323f1f48f1SPeter Holm			err(1, "read(), %s:%d", __FILE__, __LINE__);
1333f1f48f1SPeter Holm		if (n == 0)
1343f1f48f1SPeter Holm			break;
1353f1f48f1SPeter Holm
1363f1f48f1SPeter Holm	}
1373f1f48f1SPeter Holm	close(msgsock);
1383f1f48f1SPeter Holm	close(tcpsock);
1393f1f48f1SPeter Holm	close(fd);
1403f1f48f1SPeter Holm	return;
1413f1f48f1SPeter Holm}
1423f1f48f1SPeter Holm
1433f1f48f1SPeter Holmstatic void *
1443f1f48f1SPeter Holmthr(void *data __unused)
1453f1f48f1SPeter Holm{
1463f1f48f1SPeter Holm	pthread_set_name_np(pthread_self(), __func__);
1473f1f48f1SPeter Holm	go = 1;
1483f1f48f1SPeter Holm	while (go == 1) {
1493f1f48f1SPeter Holm		ftruncate(fd, FSIZE / 2);
1503f1f48f1SPeter Holm		ftruncate(fd, FSIZE);
1513f1f48f1SPeter Holm	}
1523f1f48f1SPeter Holm
1533f1f48f1SPeter Holm	return (NULL);
1543f1f48f1SPeter Holm}
1553f1f48f1SPeter Holm
1563f1f48f1SPeter Holmstatic void
1573f1f48f1SPeter Holmwriter(void) {
1583f1f48f1SPeter Holm	struct hostent *hostent;
1593f1f48f1SPeter Holm	struct sockaddr_in inetaddr;
1603f1f48f1SPeter Holm	pthread_t tid;
1613f1f48f1SPeter Holm	off_t off = 0;
1623f1f48f1SPeter Holm	size_t size;
1633f1f48f1SPeter Holm	int i, on, r, tcpsock;
1643f1f48f1SPeter Holm
1653f1f48f1SPeter Holm	on = 1;
1663f1f48f1SPeter Holm	for (i = 1; i < 5; i++) {
1673f1f48f1SPeter Holm		if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
1683f1f48f1SPeter Holm			err(1, "socket(), %s:%d", __FILE__, __LINE__);
1693f1f48f1SPeter Holm
1703f1f48f1SPeter Holm		if (setsockopt(tcpsock,
1713f1f48f1SPeter Holm		    SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0)
1723f1f48f1SPeter Holm			err(1, "setsockopt(), %s:%d", __FILE__, __LINE__);
1733f1f48f1SPeter Holm
1743f1f48f1SPeter Holm		size = getpagesize();
1753f1f48f1SPeter Holm		if (setsockopt(tcpsock, SOL_SOCKET, SO_SNDBUF, (void *)&size,
1763f1f48f1SPeter Holm		    sizeof(size)) < 0)
1773f1f48f1SPeter Holm			err(1, "setsockopt(SO_SNDBUF), %s:%d",
1783f1f48f1SPeter Holm			    __FILE__, __LINE__);
1793f1f48f1SPeter Holm
1803f1f48f1SPeter Holm		hostent = gethostbyname ("localhost");
1813f1f48f1SPeter Holm		memcpy (&inetaddr.sin_addr.s_addr, hostent->h_addr,
1823f1f48f1SPeter Holm			sizeof (struct in_addr));
1833f1f48f1SPeter Holm
1843f1f48f1SPeter Holm		inetaddr.sin_family = AF_INET;
1853f1f48f1SPeter Holm		inetaddr.sin_port = htons(port);
1863f1f48f1SPeter Holm		inetaddr.sin_len = sizeof(inetaddr);
1873f1f48f1SPeter Holm
1883f1f48f1SPeter Holm		r = connect(tcpsock, (struct sockaddr *) &inetaddr,
1893f1f48f1SPeter Holm			sizeof(inetaddr));
1903f1f48f1SPeter Holm		if (r == 0)
1913f1f48f1SPeter Holm			break;
1923f1f48f1SPeter Holm		sleep(1);
1933f1f48f1SPeter Holm		close(tcpsock);
1943f1f48f1SPeter Holm	}
1953f1f48f1SPeter Holm	if (r < 0)
1963f1f48f1SPeter Holm		err(1, "connect(), %s:%d", __FILE__, __LINE__);
1973f1f48f1SPeter Holm
1983f1f48f1SPeter Holm	if ((fd = open(inputFile, O_RDWR | O_CREAT | O_TRUNC, 0640)) == -1)
1993f1f48f1SPeter Holm		err(1, "open(%s)", inputFile);
2003f1f48f1SPeter Holm
2013f1f48f1SPeter Holm	if (write(fd, buf, sizeof(buf)) != sizeof(buf))
2023f1f48f1SPeter Holm		err(1, "write()");
2033f1f48f1SPeter Holm
2043f1f48f1SPeter Holm	r = pthread_create(&tid, NULL, thr, NULL);
2053f1f48f1SPeter Holm	if (r)
2063f1f48f1SPeter Holm		errc(1, r, "pthread_create");
2073f1f48f1SPeter Holm
2083f1f48f1SPeter Holm	usleep(5000);
2093f1f48f1SPeter Holm	if (sendfile(fd, tcpsock, 0, FSIZE, NULL, &off, 0) == -1)
2103f1f48f1SPeter Holm		err(1, "sendfile");
2113f1f48f1SPeter Holm
2123f1f48f1SPeter Holm	usleep(arc4random() % 20000);
2133f1f48f1SPeter Holm	go = 0;
2143f1f48f1SPeter Holm	if ((r = pthread_join(tid, NULL)) != 0)
2153f1f48f1SPeter Holm		errc(1, r, "pthread_join");
2163f1f48f1SPeter Holm
2173f1f48f1SPeter Holm	_exit(0);
2183f1f48f1SPeter Holm}
2193f1f48f1SPeter Holm
2203f1f48f1SPeter Holmint
2213f1f48f1SPeter Holmmain(int argc, char **argv)
2223f1f48f1SPeter Holm{
2233f1f48f1SPeter Holm	pid_t pid;
2243f1f48f1SPeter Holm	time_t start;
2253f1f48f1SPeter Holm
2263f1f48f1SPeter Holm	if (argc != 4) {
2273f1f48f1SPeter Holm		fprintf(stderr, "Usage: %s <inputFile outputFile portNumber\n",
2283f1f48f1SPeter Holm		    argv[0]);
2293f1f48f1SPeter Holm		return (1);
2303f1f48f1SPeter Holm	}
2313f1f48f1SPeter Holm	inputFile = argv[1];
2323f1f48f1SPeter Holm	outputFile = argv[2];
2333f1f48f1SPeter Holm	port = atoi(argv[3]);
2343f1f48f1SPeter Holm	pthread_set_name_np(pthread_self(), __func__);
2353f1f48f1SPeter Holm
2363f1f48f1SPeter Holm	start = time(NULL);
2373f1f48f1SPeter Holm	while (time(NULL) - start < 120) {
2383f1f48f1SPeter Holm		if ((pid = fork()) == 0) {
2393f1f48f1SPeter Holm			writer();
2403f1f48f1SPeter Holm		} else if (pid > 0) {
2413f1f48f1SPeter Holm			reader();
2423f1f48f1SPeter Holm			kill(pid, SIGINT);
2433f1f48f1SPeter Holm			if (waitpid(pid, NULL, 0) != pid)
2443f1f48f1SPeter Holm				err(1, "waitpid()");
2453f1f48f1SPeter Holm		} else
2463f1f48f1SPeter Holm			err(1, "fork(), %s:%d",  __FILE__, __LINE__);
2473f1f48f1SPeter Holm	}
2483f1f48f1SPeter Holm
2493f1f48f1SPeter Holm	return (0);
2503f1f48f1SPeter Holm}
251