#include "../file_common.h"
static void usage(char *progname);
static void
usage(char *progname)
{
(void) fprintf(stderr,
"usage: %s [-l filesize] [-s start-offset]"
"[-n section-len] filename\n", progname);
exit(1);
}
int
main(int argc, char *argv[])
{
char *filename = NULL;
char *buf;
size_t filesize = 0;
off_t start_off = 0;
off_t off_len = 0;
int fd, ch;
struct flock fl;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
while ((ch = getopt(argc, argv, "l:s:n:")) != EOF) {
switch (ch) {
case 'l':
filesize = atoll(optarg);
break;
case 's':
start_off = atoll(optarg);
break;
case 'n':
off_len = atoll(optarg);
break;
default:
usage(argv[0]);
break;
}
}
if (optind == argc - 1)
filename = argv[optind];
else
usage(argv[0]);
buf = (char *)malloc(filesize);
if ((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, mode)) < 0) {
perror("open");
free(buf);
return (1);
}
if (write(fd, buf, filesize) < filesize) {
perror("write");
free(buf);
return (1);
}
fl.l_whence = SEEK_SET;
fl.l_start = start_off;
fl.l_len = off_len;
if (fcntl(fd, F_FREESP, &fl) != 0) {
perror("fcntl");
free(buf);
return (1);
}
free(buf);
return (0);
}