Home | History | Annotate | Line # | Download | only in ckckp
      1 /*	$NetBSD: cleanalot_async.c,v 1.7 2008/04/28 20:23:06 martin Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2006 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Konrad E. Schroder <perseant (at) hhhh.org>.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <stdio.h>
     33 #include <stdlib.h>
     34 #include <signal.h>
     35 #include <string.h>
     36 #include <unistd.h>
     37 
     38 void dirname(int n, char *s)
     39 {
     40 	if (n == 0) {
     41 		strcat(s, "/0");
     42 		mkdir(s);
     43 	}
     44 	while (n) {
     45 		sprintf(s + strlen(s), "/%x", n & 0xf);
     46 		n >>= 4;
     47 		mkdir(s);
     48 	}
     49 }
     50 
     51 /*
     52  * Write a file, creating the directory if necessary.
     53  */
     54 int write_file(int gen, int n, int plex, char *buf, int size)
     55 {
     56 	FILE *fp;
     57 	char s[1024], *t;
     58 	int r;
     59 
     60 	sprintf(s, "dir_%x_%x", plex, gen);
     61 	dirname(n, s);
     62 	strcat(s, ".file");
     63 
     64 	/* printf("write file %d.%d.%x: %s\n", gen, plex, n, s); */
     65 
     66 	fp = fopen(s, "wb");
     67 	if (fp == NULL)
     68 		return 0;
     69 	if (size)
     70 	r = fwrite(buf, size, 1, fp);
     71 	else
     72 		r = 1;
     73 	fclose(fp);
     74 
     75 	return r;
     76 }
     77 
     78 int write_dirs(int gen, int size, int plex)
     79 {
     80 	int i, j, tot;
     81 	char s[1024];
     82 	char *buf;
     83 
     84 	/* Create all base dirs */
     85 	for (i = 0; i < plex; i++) {
     86 		sprintf(s, "dir_%x_%x", i, gen);
     87 		if (mkdir(s, 0700) != 0)
     88 			return 0;
     89 	}
     90 
     91 	/* Write files */
     92 	if (size) {
     93 	buf = malloc(size);
     94 	if (buf == NULL)
     95 		return 0;
     96 	}
     97 	tot = 0;
     98 	for (i = 0; ; i++) {
     99 		for (j = 0; j < plex; j++) {
    100 			if (write_file(gen, i, j, buf, size) == 0) {
    101 				if (size)
    102 				free(buf);
    103 				return tot;
    104 			}
    105 			++tot;
    106 		}
    107 	}
    108 	/* NOTREACHED */
    109 }
    110 
    111 int main(int argc, char **argv)
    112 {
    113 	int c, i, j;
    114 	int bs = 0;
    115 	int count = 0;
    116 	int plex = 2;
    117 	char cmd[1024];
    118 
    119 	bs = -1;
    120 	while((c = getopt(argc, argv, "b:n:p:")) != -1) {
    121 		switch(c) {
    122 		    case 'b':
    123 			bs = atoi(optarg);
    124 			break;
    125 		    case 'n':
    126 			count = atoi(optarg);
    127 			break;
    128 		    case 'p':
    129 			plex = atoi(optarg);
    130 			break;
    131 		    default:
    132 			exit(1);
    133 		}
    134 	}
    135 
    136 	/*
    137 	 * Process old-style, non-flag parameters
    138 	 */
    139 	if (count == 0) {
    140 		if (argv[optind] != NULL)
    141 			count = atoi(argv[optind]);
    142 	}
    143 	if (bs < 0 && getenv("BS") != NULL)
    144 		bs = atoi(getenv("BS"));
    145 	if (bs < 0)
    146 		bs = 16384;
    147 	if (plex == 0)
    148 		plex = 2;
    149 
    150 	for (i = 0; count == 0 || i < count; i++) {
    151 		if (count)
    152 			printf("::: begin iteration %d/%d\n", i, count);
    153 		else
    154 			printf("::: begin iteration %d\n", i);
    155 
    156 		for (j = 0; ; j++) {
    157 			if ((c = write_dirs(j, bs, plex)) == 0)
    158 				break;
    159 			printf("%d: %d files of size %d\n", j, c, bs);
    160 			sprintf(cmd, "rm -rf dir_%x_%x", plex - 1, j);
    161 			system(cmd);
    162 			sync();
    163 		}
    164 		system("df -k .");
    165 		printf("remove files\n");
    166 		system("rm -rf dir_*");
    167 		system("df -k .");
    168 	}
    169 }
    170