#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <err.h>
#define BF_SZ 512
extern void usage(char *, char *);
extern void create_file(char *, quad_t, int, int);
extern void err_rm(char *, char *);
int
main (argc, argv)
int argc;
char **argv;
{
char *b_num, *prog_name;
char *options = "nv";
char c;
off_t multiplier = 1;
off_t file_size;
int len;
int empty = 0;
int verbose = 0;
char* endptr = NULL;
prog_name = argv[0];
if (1 == argc)
usage(prog_name, options);
opterr=1;
while ((c=getopt(argc, argv, options)) != EOF)
switch (c) {
case 'v':
verbose = 1;
break;
case 'n':
empty = 1;
break;
default:
usage(prog_name, options);
break;
}
argv += optind;
if (*argv == NULL)
usage(prog_name, options);
b_num = *argv++;
len = strlen(b_num) - 1;
if (!isdigit(b_num[len])) {
switch(b_num[len]) {
case 'B':
case 'b':
multiplier = 512;
break;
case 'K':
case 'k':
multiplier = 1024;
break;
case 'M':
case 'm':
multiplier = 1024 * 1024;
break;
case 'G':
case 'g':
multiplier = 1024 * 1024 * 1024;
break;
default:
usage(prog_name, options);
}
}
if (*argv == NULL)
usage(prog_name, options);
if ((file_size = strtoll(b_num, &endptr, 10)) == 0 &&
(*endptr != 0 && endptr != &b_num[len])) {
err(1, "Bad file size!");
}
while ( *argv != NULL ) {
create_file(*argv, file_size*multiplier, empty, verbose);
argv++;
}
return (0);
}
void
create_file(file_name, size, empty, verbose)
char *file_name;
quad_t size;
int empty;
int verbose;
{
char buff[BF_SZ];
int fd, bytes_written = BF_SZ;
quad_t i;
mode_t mode = S_IRUSR | S_IWUSR;
if (!geteuid()) mode |= S_ISVTX;
if ((fd = open(file_name, O_RDWR | O_CREAT | O_TRUNC, mode)) == -1)
err(1, NULL);
if (empty) {
lseek(fd, (off_t)size-1, SEEK_SET);
if ( 1 != write(fd, "\0", 1))
err_rm(file_name, "Write Error");
}
else {
bzero(buff, BF_SZ);
for (i = size; i > BF_SZ; i -= bytes_written) {
bytes_written = write (fd, buff, BF_SZ);
if ( bytes_written == -1 )
err_rm (file_name, "Write Error");
}
for (; i > 0; i -= bytes_written) {
bytes_written = write (fd, buff, i);
if ( bytes_written == -1 )
err_rm (file_name, "Write Error");
}
}
if (fchmod(fd, mode))
err_rm(file_name, NULL);
if ((close(fd)) == -1)
err_rm(file_name, NULL);
if (verbose)
(void)fprintf(stderr, "%s %qd bytes\n", file_name, size);
}
void
err_rm(filename, msg)
char *filename;
char *msg;
{
unlink(filename);
err(1, "(%s removed) %s", filename, msg);
}
void
usage (prog_name, options)
char *prog_name;
char *options;
{
(void)fprintf(stderr,
"usage: %s [-%s] size[b|k|m|g] filename ...\n", prog_name, options);
exit(1);
}