Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/modules/mkfile/mkfile.c

    rc672195 rf9d8c3a  
    2626 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2727 */
    28 
    2928
    3029#include <stdio.h>
     
    5554static struct option const long_options[] = {
    5655        {"size", required_argument, 0, 's'},
     56        {"sparse", no_argument, 0, 'p'},
    5757        {"help", no_argument, 0, 'h'},
    5858        {0, 0, 0, 0}
     
    7070                "  -h, --help       A short option summary\n"
    7171                "  -s, --size sz    Size of the file\n"
     72                "  -p, --sparse     Create a sparse file\n"
    7273                "\n"
    7374                "Size is a number followed by 'k', 'm' or 'g' for kB, MB, GB.\n"
     
    116117        ssize_t file_size;
    117118        ssize_t total_written;
    118         ssize_t to_write, rc;
     119        ssize_t to_write, rc, rc2 = 0;
    119120        char *file_name;
    120121        void *buffer;
     122        bool create_sparse = false;
    121123
    122124        file_size = 0;
     
    125127
    126128        for (c = 0, optind = 0, opt_ind = 0; c != -1;) {
    127                 c = getopt_long(argc, argv, "s:h", long_options, &opt_ind);
     129                c = getopt_long(argc, argv, "ps:h", long_options, &opt_ind);
    128130                switch (c) {
    129131                case 'h':
    130132                        help_cmd_mkfile(HELP_LONG);
    131133                        return CMD_SUCCESS;
     134                case 'p':
     135                        create_sparse = true;
     136                        break;
    132137                case 's':
    133138                        file_size = read_size(optarg);
     
    155160                printf("%s: failed to create file %s.\n", cmdname, file_name);
    156161                return CMD_FAILURE;
     162        }
     163
     164        if (create_sparse && file_size > 0) {
     165                const char byte = 0x00;
     166
     167                if ((rc2 = lseek(fd, file_size - 1, SEEK_SET)) < 0)
     168                        goto exit;
     169
     170                rc2 = write(fd, &byte, sizeof(char));
     171                goto exit;
    157172        }
    158173
     
    175190        }
    176191
     192        free(buffer);
     193exit:
    177194        rc = close(fd);
    178         if (rc != 0) {
     195
     196        if (rc != 0 || rc2 < 0) {
    179197                printf("%s: Error writing file (%zd).\n", cmdname, rc);
    180198                return CMD_FAILURE;
    181199        }
    182 
    183         free(buffer);
    184200
    185201        return CMD_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.