X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=util%2Ftrunc.c;fp=util%2Ftrunc.c;h=fb52ec2564505cdacc5a24312b3eb91d439f3a2c;hp=0000000000000000000000000000000000000000;hb=e65c797cc6fd5b2b6a18c66a86faea4a38de575c;hpb=c1b7382ec4c25c23c81a0e0964d94fff72c6a633 diff --git a/util/trunc.c b/util/trunc.c new file mode 100644 index 00000000..fb52ec25 --- /dev/null +++ b/util/trunc.c @@ -0,0 +1,132 @@ +/* trunc.c: Set the size of an existing file, or create a file of a + * specified size. + * + * Copyright (C) 2008 Micah J. Cowan + * + * Copying and distribution of this file, with or without modification, + * are permitted in any medium without royalty provided the copyright + * notice and this notice are preserved. */ + +#include +#include +#include +#include +#include +#include + +#define PROGRAM_NAME "trunc" + +void +usage (FILE *f) +{ + fputs ( +PROGRAM_NAME " [-c] file sz\n\ +\n\ +Set the filesize of FILE to SIZE.\n\ +\n\ + -c: create FILE if it doesn't exist.\n\ +\n\ + Multiplier suffixes for SIZE (case-insensitive):\n\ + k: SIZE * 1024\n\ + m: SIZE * 1024 * 1024\n", f); +} + +off_t +get_size (const char str[]) +{ + unsigned long val; + int suffix; + char *end; + + errno = 0; + val = strtoul(str, &end, 10); + if (end == str) + { + fputs (PROGRAM_NAME ": size is not a number.\n", stderr); + usage (stderr); + exit (EXIT_FAILURE); + } + else if (errno == ERANGE + || (unsigned long)(off_t)val != val) + { + fputs (PROGRAM_NAME ": size is out of range.\n", stderr); + exit (EXIT_FAILURE); + } + + suffix = tolower ((unsigned char) end[0]); + if (suffix == 'k') + { + val *= 1024; + } + else if (suffix == 'm') + { + val *= 1024 * 1024; + } + + return val; +} + +int +main (int argc, char *argv[]) +{ + const char *fname; + const char *szstr; + off_t sz; + int create = 0; + int option; + int fd; + + /* Parse options. */ + while ((option = getopt (argc, argv, "c")) != -1) + { + switch (option) { + case 'c': + create = 1; + break; + case '?': + fprintf (stderr, PROGRAM_NAME ": Unrecognized option `%c'.\n\n", + optopt); + usage (stderr); + exit (EXIT_FAILURE); + default: + /* We shouldn't reach here. */ + abort(); + } + } + + if (argv[optind] == NULL + || argv[optind+1] == NULL + || argv[optind+2] != NULL) + { + usage (stderr); + exit (EXIT_FAILURE); + } + + fname = argv[optind]; + szstr = argv[optind+1]; + + sz = get_size(szstr); + if (create) + { + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + fd = open(fname, O_WRONLY | O_CREAT, mode); + } + else + { + fd = open(fname, O_WRONLY); + } + + if (fd == -1) + { + perror (PROGRAM_NAME ": open"); + exit (EXIT_FAILURE); + } + + if (ftruncate(fd, sz) == -1) + { + perror (PROGRAM_NAME ": truncate"); + exit (EXIT_FAILURE); + } + + return 0; +}