1*8a272653SPeter Holm#!/bin/sh 2*8a272653SPeter Holm 3*8a272653SPeter Holm# 4*8a272653SPeter Holm# Copyright (c) 2012 Peter Holm <pho@FreeBSD.org> 5*8a272653SPeter Holm# All rights reserved. 6*8a272653SPeter Holm# 7*8a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 8*8a272653SPeter Holm# modification, are permitted provided that the following conditions 9*8a272653SPeter Holm# are met: 10*8a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 11*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 12*8a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 13*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 14*8a272653SPeter Holm# documentation and/or other materials provided with the distribution. 15*8a272653SPeter Holm# 16*8a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*8a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*8a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*8a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*8a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*8a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*8a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*8a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*8a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*8a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*8a272653SPeter Holm# SUCH DAMAGE. 27*8a272653SPeter Holm# 28*8a272653SPeter Holm 29*8a272653SPeter Holm# Copy of callout_reset_on.sh. Waiting to see if this catches anything. 30*8a272653SPeter Holm 31*8a272653SPeter Holm. ../default.cfg 32*8a272653SPeter Holm 33*8a272653SPeter Holmrm -f /tmp/crwriter2 /tmp/crlogger2 || exit 1 34*8a272653SPeter Holm 35*8a272653SPeter Holmcat > /tmp/crwriter2.c <<EOF 36*8a272653SPeter Holm#include <stdio.h> 37*8a272653SPeter Holm#include <stdlib.h> 38*8a272653SPeter Holm#include <string.h> 39*8a272653SPeter Holm#include <time.h> 40*8a272653SPeter Holm#include <unistd.h> 41*8a272653SPeter Holm 42*8a272653SPeter Holmchar *txt[] = { 43*8a272653SPeter Holm "0 This is a line of text: abcdefghijklmnopqrstuvwxyz", 44*8a272653SPeter Holm "1 Another line of text: ABCDEFGHIJKLMNOPQRSTUVWXYZ", 45*8a272653SPeter Holm "2 A different line of text", 46*8a272653SPeter Holm "3 A very, very different text", 47*8a272653SPeter Holm "4 A much longer line with a lot of characters in the line", 48*8a272653SPeter Holm "5 Now this is a quite long line of text, with both upper and lower case letters, and one digit!" 49*8a272653SPeter Holm}; 50*8a272653SPeter Holm 51*8a272653SPeter Holm#define RUNTIME (10 * 60) 52*8a272653SPeter Holm 53*8a272653SPeter Holmint 54*8a272653SPeter Holmmain(void) 55*8a272653SPeter Holm{ 56*8a272653SPeter Holm time_t start; 57*8a272653SPeter Holm int j, n; 58*8a272653SPeter Holm char help[256]; 59*8a272653SPeter Holm 60*8a272653SPeter Holm start = time(NULL); 61*8a272653SPeter Holm while (time(NULL) - start < RUNTIME) { 62*8a272653SPeter Holm j = arc4random() % 6; 63*8a272653SPeter Holm n = arc4random() % strlen(txt[j]); 64*8a272653SPeter Holm strncpy(help, txt[j], n); 65*8a272653SPeter Holm help[n] = 0; 66*8a272653SPeter Holm printf("%s\n", txt[j]); 67*8a272653SPeter Holm if ((arc4random() % 1000) == 1) 68*8a272653SPeter Holm usleep(100000); 69*8a272653SPeter Holm } 70*8a272653SPeter Holm 71*8a272653SPeter Holm return (0); 72*8a272653SPeter Holm} 73*8a272653SPeter HolmEOF 74*8a272653SPeter Holmmycc -o /tmp/crwriter2 -Wall -Wextra -O2 -g /tmp/crwriter2.c 75*8a272653SPeter Holmrm -f /tmp/crwriter2.c 76*8a272653SPeter Holm 77*8a272653SPeter Holmcat > /tmp/crlogger2.c <<EOF 78*8a272653SPeter Holm#include <sys/param.h> 79*8a272653SPeter Holm#include <sys/mman.h> 80*8a272653SPeter Holm#include <sys/socket.h> 81*8a272653SPeter Holm#include <sys/wait.h> 82*8a272653SPeter Holm 83*8a272653SPeter Holm#include <machine/atomic.h> 84*8a272653SPeter Holm 85*8a272653SPeter Holm#include <err.h> 86*8a272653SPeter Holm#include <err.h> 87*8a272653SPeter Holm#include <errno.h> 88*8a272653SPeter Holm#include <fcntl.h> 89*8a272653SPeter Holm#include <netdb.h> 90*8a272653SPeter Holm#include <netinet/in.h> 91*8a272653SPeter Holm#include <signal.h> 92*8a272653SPeter Holm#include <stdio.h> 93*8a272653SPeter Holm#include <stdio.h> 94*8a272653SPeter Holm#include <stdlib.h> 95*8a272653SPeter Holm#include <string.h> 96*8a272653SPeter Holm#include <unistd.h> 97*8a272653SPeter Holm#include <unistd.h> 98*8a272653SPeter Holm 99*8a272653SPeter Holmvolatile u_int *share; 100*8a272653SPeter Holm 101*8a272653SPeter Holm#define SYNC 0 102*8a272653SPeter Holm 103*8a272653SPeter Holmpid_t pid; 104*8a272653SPeter Holmint bufsize; 105*8a272653SPeter Holmint port; 106*8a272653SPeter Holmint alarm_exit; 107*8a272653SPeter Holm 108*8a272653SPeter Holmvoid 109*8a272653SPeter Holmkiller(void) 110*8a272653SPeter Holm{ 111*8a272653SPeter Holm setproctitle("killer"); 112*8a272653SPeter Holm while (share[SYNC] == 0) 113*8a272653SPeter Holm ; 114*8a272653SPeter Holm alarm(120); 115*8a272653SPeter Holm for (;;) { 116*8a272653SPeter Holm if (pid == 0) 117*8a272653SPeter Holm break; 118*8a272653SPeter Holm if (kill(pid, SIGUSR1) == -1) 119*8a272653SPeter Holm break; 120*8a272653SPeter Holm usleep(arc4random() % 2000 + 10); 121*8a272653SPeter Holm } 122*8a272653SPeter Holm _exit(0); 123*8a272653SPeter Holm} 124*8a272653SPeter Holm 125*8a272653SPeter Holmvoid 126*8a272653SPeter Holmhandler(int s __unused) 127*8a272653SPeter Holm{ 128*8a272653SPeter Holm} 129*8a272653SPeter Holm 130*8a272653SPeter Holmvoid 131*8a272653SPeter Holmahandler(int s __unused) 132*8a272653SPeter Holm{ 133*8a272653SPeter Holm if (alarm_exit) 134*8a272653SPeter Holm _exit(0); 135*8a272653SPeter Holm} 136*8a272653SPeter Holm 137*8a272653SPeter Holm/* Read form socket, discard */ 138*8a272653SPeter Holmstatic void 139*8a272653SPeter Holmreader(void) { 140*8a272653SPeter Holm int tcpsock, msgsock; 141*8a272653SPeter Holm int on; 142*8a272653SPeter Holm socklen_t len; 143*8a272653SPeter Holm struct sockaddr_in inetaddr, inetpeer; 144*8a272653SPeter Holm int n, *buf; 145*8a272653SPeter Holm 146*8a272653SPeter Holm setproctitle("reader - init"); 147*8a272653SPeter Holm on = 1; 148*8a272653SPeter Holm if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 149*8a272653SPeter Holm err(1, "socket(), %s:%d", __FILE__, __LINE__); 150*8a272653SPeter Holm 151*8a272653SPeter Holm if (setsockopt(tcpsock, 152*8a272653SPeter Holm SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 153*8a272653SPeter Holm err(1, "setsockopt(), %s:%d", __FILE__, __LINE__); 154*8a272653SPeter Holm 155*8a272653SPeter Holm inetaddr.sin_family = AF_INET; 156*8a272653SPeter Holm inetaddr.sin_addr.s_addr = INADDR_ANY; 157*8a272653SPeter Holm inetaddr.sin_port = htons(port); 158*8a272653SPeter Holm inetaddr.sin_len = sizeof(inetaddr); 159*8a272653SPeter Holm 160*8a272653SPeter Holm signal(SIGUSR1, handler); 161*8a272653SPeter Holm alarm(60); 162*8a272653SPeter Holm if (bind(tcpsock, 163*8a272653SPeter Holm (struct sockaddr *)&inetaddr, sizeof (inetaddr)) < 0) 164*8a272653SPeter Holm err(1, "bind(), %s:%d", __FILE__, __LINE__); 165*8a272653SPeter Holm 166*8a272653SPeter Holm if (listen(tcpsock, 5) < 0) 167*8a272653SPeter Holm err(1, "listen(), %s:%d", __FILE__, __LINE__); 168*8a272653SPeter Holm 169*8a272653SPeter Holm len = sizeof(inetpeer); 170*8a272653SPeter Holm if ((msgsock = accept(tcpsock, 171*8a272653SPeter Holm (struct sockaddr *)&inetpeer, &len)) < 0) 172*8a272653SPeter Holm err(1, "accept(), %s:%d", __FILE__, __LINE__); 173*8a272653SPeter Holm 174*8a272653SPeter Holm if ((buf = malloc(bufsize)) == NULL) 175*8a272653SPeter Holm err(1, "malloc(%d), %s:%d", bufsize, __FILE__, __LINE__); 176*8a272653SPeter Holm setproctitle("reader"); 177*8a272653SPeter Holm alarm(0); 178*8a272653SPeter Holm signal(SIGALRM, ahandler); 179*8a272653SPeter Holm for (;;) { 180*8a272653SPeter Holm ualarm(arc4random() % 5000 + 100, 0); 181*8a272653SPeter Holm if ((n = recvfrom(msgsock, buf, bufsize, 0, NULL, NULL)) < 0) { 182*8a272653SPeter Holm if (errno == EAGAIN) 183*8a272653SPeter Holm continue; 184*8a272653SPeter Holm err(1, "read(), %s:%d", __FILE__, __LINE__); 185*8a272653SPeter Holm } 186*8a272653SPeter Holm if (n == 0) 187*8a272653SPeter Holm break; 188*8a272653SPeter Holm if (write(msgsock, "OK", 3) != 3) 189*8a272653SPeter Holm err(1, "write ack. %s:%d", __FILE__, __LINE__); 190*8a272653SPeter Holm 191*8a272653SPeter Holm } 192*8a272653SPeter Holm close(msgsock); 193*8a272653SPeter Holm _exit(0); 194*8a272653SPeter Holm} 195*8a272653SPeter Holm 196*8a272653SPeter Holm/* read from stdin, write to socket */ 197*8a272653SPeter Holmstatic void 198*8a272653SPeter Holmwriter(void) { 199*8a272653SPeter Holm int tcpsock, on; 200*8a272653SPeter Holm struct sockaddr_in inetaddr; 201*8a272653SPeter Holm struct hostent *hostent; 202*8a272653SPeter Holm int i, r; 203*8a272653SPeter Holm char line[1024], ack[80];; 204*8a272653SPeter Holm 205*8a272653SPeter Holm setproctitle("writer - init"); 206*8a272653SPeter Holm share[SYNC] = 1; 207*8a272653SPeter Holm signal(SIGUSR1, handler); 208*8a272653SPeter Holm signal(SIGALRM, ahandler); 209*8a272653SPeter Holm alarm(60); 210*8a272653SPeter Holm on = 1; 211*8a272653SPeter Holm for (i = 1; i < 5; i++) { 212*8a272653SPeter Holm if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 213*8a272653SPeter Holm err(1, "socket(), %s:%d", __FILE__, __LINE__); 214*8a272653SPeter Holm 215*8a272653SPeter Holm if (setsockopt(tcpsock, 216*8a272653SPeter Holm SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 217*8a272653SPeter Holm err(1, "setsockopt(), %s:%d", __FILE__, __LINE__); 218*8a272653SPeter Holm 219*8a272653SPeter Holm hostent = gethostbyname ("localhost"); 220*8a272653SPeter Holm bzero(&inetaddr, sizeof(inetaddr)); 221*8a272653SPeter Holm memcpy (&inetaddr.sin_addr.s_addr, hostent->h_addr, 222*8a272653SPeter Holm sizeof (struct in_addr)); 223*8a272653SPeter Holm 224*8a272653SPeter Holm inetaddr.sin_family = AF_INET; 225*8a272653SPeter Holm inetaddr.sin_port = htons(port); 226*8a272653SPeter Holm inetaddr.sin_len = sizeof(inetaddr); 227*8a272653SPeter Holm 228*8a272653SPeter Holm r = connect(tcpsock, (struct sockaddr *) &inetaddr, 229*8a272653SPeter Holm sizeof(inetaddr)); 230*8a272653SPeter Holm if (r == 0) 231*8a272653SPeter Holm break; 232*8a272653SPeter Holm sleep(1); 233*8a272653SPeter Holm close(tcpsock); 234*8a272653SPeter Holm } 235*8a272653SPeter Holm if (r < 0) 236*8a272653SPeter Holm err(1, "connect(), %s:%d", __FILE__, __LINE__); 237*8a272653SPeter Holm 238*8a272653SPeter Holm setproctitle("writer"); 239*8a272653SPeter Holm alarm(0); 240*8a272653SPeter Holm while (fgets(line, sizeof(line), stdin) != NULL) { 241*8a272653SPeter Holm alarm(10); 242*8a272653SPeter Holm alarm_exit = 1; 243*8a272653SPeter Holm if (write(tcpsock, line, strlen(line)) < 0) 244*8a272653SPeter Holm err(1, "socket write(). %s:%d", __FILE__, __LINE__); 245*8a272653SPeter Holm alarm_exit = 0; 246*8a272653SPeter Holm ualarm(arc4random() % 5000 + 1000, 0); 247*8a272653SPeter Holm if (recvfrom(tcpsock, ack, 4, 0, NULL, NULL) < 0) { 248*8a272653SPeter Holm if (errno == EAGAIN) 249*8a272653SPeter Holm continue; 250*8a272653SPeter Holm err(1, "read(), %s:%d", __FILE__, __LINE__); 251*8a272653SPeter Holm } 252*8a272653SPeter Holm } 253*8a272653SPeter Holm sleep(30); 254*8a272653SPeter Holm return; 255*8a272653SPeter Holm} 256*8a272653SPeter Holm 257*8a272653SPeter Holmint 258*8a272653SPeter Holmmain(int argc, char **argv) 259*8a272653SPeter Holm{ 260*8a272653SPeter Holm 261*8a272653SPeter Holm pid_t kpid; 262*8a272653SPeter Holm size_t len; 263*8a272653SPeter Holm 264*8a272653SPeter Holm if (argc != 2) { 265*8a272653SPeter Holm fprintf(stderr, "Usage: %s <port number>\n", argv[0]); 266*8a272653SPeter Holm _exit(1); 267*8a272653SPeter Holm } 268*8a272653SPeter Holm port = atoi(argv[1]); 269*8a272653SPeter Holm bufsize = 128; 270*8a272653SPeter Holm 271*8a272653SPeter Holm len = PAGE_SIZE; 272*8a272653SPeter Holm if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, 273*8a272653SPeter Holm MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) 274*8a272653SPeter Holm err(1, "mmap"); 275*8a272653SPeter Holm 276*8a272653SPeter Holm signal(SIGCHLD, SIG_IGN); 277*8a272653SPeter Holm if ((pid = fork()) == 0) 278*8a272653SPeter Holm reader(); 279*8a272653SPeter Holm 280*8a272653SPeter Holm if ((kpid = fork()) == 0) 281*8a272653SPeter Holm killer(); 282*8a272653SPeter Holm 283*8a272653SPeter Holm writer(); 284*8a272653SPeter Holm sleep(1); 285*8a272653SPeter Holm kill(pid, SIGINT); 286*8a272653SPeter Holm kill(kpid, SIGINT); 287*8a272653SPeter Holm 288*8a272653SPeter Holm return (0); 289*8a272653SPeter Holm} 290*8a272653SPeter HolmEOF 291*8a272653SPeter Holmmycc -o /tmp/crlogger2 -Wall -Wextra -O2 -g /tmp/crlogger2.c 292*8a272653SPeter Holmrm -f /tmp/crlogger2.c 293*8a272653SPeter Holm 294*8a272653SPeter HolmN=50 295*8a272653SPeter Holmcd /tmp 296*8a272653SPeter Holmfor j in `jot $N`; do 297*8a272653SPeter Holm /tmp/crwriter2 | /tmp/crlogger2 1236$j & 298*8a272653SPeter Holmdone 299*8a272653SPeter Holmwait 300*8a272653SPeter Holmrm -f /tmp/crwriter2 /tmp/crlogger2 301*8a272653SPeter Holmexit 0 302