Blesk

mkhole.c

Stáhnout

#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;
}