Viewing: ll_sparseness_write.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 */

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>

#define BUFSIZE (1024 * 1024)

/*
 * Function: pwrite character '+' to <filename> at <offset> (man pwrite)
 * Return:   0 success
 *           1 failure
 */
int main(int argc, char **argv)
{
	int p_size;
	loff_t offset;
	char *filename;
	int fd;
	char buf[] = "+++";
	char *end;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s <filename> <offset>(KB)\n", argv[0]);
		exit(1);
	}

	filename = argv[1];
	offset = strtoul(argv[2], &end, 10);
	if (*end) {
		fprintf(stderr, "<offset> parameter should be integer\n");
		exit(1);
	}

	fd = open(filename, O_CREAT|O_RDWR, 0644);
	if (fd == -1) {
		fprintf(stderr, "Opening %s fails (%s)\n",
			filename, strerror(errno));
		return 1;
	}

	/* write the character '+' at offset */
	p_size = pwrite(fd, buf, 1, offset);
	if (p_size != 1) {
		fprintf(stderr, "pwrite %s fails (%s)\n",
			filename, strerror(errno));
		close(fd);
		return 1;
	}
	close(fd);
	return 0;
}