#define _POSIX_C_SOURCE 200809L
#include <unistd.h> /* read, write, close, lseek */
#include <fcntl.h> /* openat */
#include <stdlib.h> /* exit, strtol */
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <errno.h> /* errno */
#include <err.h> /* NONPOSIX: err, errx */
/* Vyrobí soubor ‹file› s dírou o velikosti ‹MiB› mebibajtů
* + na konec napíše zadaný řetězec ‹endstring›. */
int main( int argc, char** argv )
{
if ( argc < 4 )
errx( 1, "usage: %s file MiB endstring\n", argv[ 0 ] );
const char* filename = argv[ 1 ];
long mbytes = strtol( argv[ 2 ], 0, 0 );
const char* endstring = argv[ 3 ];
int fd = openat( AT_FDCWD, filename, O_CREAT | O_TRUNC | O_WRONLY,
0666 );
if ( fd == -1 )
err( 1, "openat %s", filename );
/* Skočí na zadanou pozici, čímž se po zápisu vytvoří „díra“
* – tj. úsek v souboru nezabírající na disku žádné místo a při
* čtení vracející nulové bajty. */
lseek( fd, mbytes * 1024 * 1024, SEEK_SET );
if ( write( fd, endstring, strlen( endstring ) ) == -1 )
err( 1, "write" );
if ( close( fd ) ) warn( "close %s", filename );
return 0;
}