From: Micah Cowan Date: Mon, 4 Feb 2008 00:10:34 +0000 (-0800) Subject: Added util/trunc. X-Git-Tag: v1.13~457 X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=e65c797cc6fd5b2b6a18c66a86faea4a38de575c Added util/trunc. --- diff --git a/.hgignore b/.hgignore index 3832d65e..666c5c38 100644 --- a/.hgignore +++ b/.hgignore @@ -61,5 +61,8 @@ po/remove-potcdate.sed po/stamp-po po/en@boldquot.insert-header po/en@quot.insert-header +util/trunc +util/trunc.o +util/.deps **~ **.*.swp diff --git a/ChangeLog b/ChangeLog index cde46e57..4d92ee2f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,9 @@ * configure.in: Add checks for wchar.h, wcwidth function (to support column-counting in progress.c). * NEWS: Added line for 1.11.1. + * util/README, util/Makefile.am, util/trunc.c: Added a small + utility program to create files of arbitrary size (useful for + testing certain situations with --continue). 2008-01-31 Micah Cowan diff --git a/util/Makefile.am b/util/Makefile.am index a4d3cfa5..79866580 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -30,3 +30,5 @@ # EXTRA_DIST = README rmold.pl + +bin_PROGRAMS = trunc diff --git a/util/README b/util/README index cb305907..85708320 100644 --- a/util/README +++ b/util/README @@ -9,3 +9,7 @@ This Perl script is used to check which local files are no longer on the remote server. You can use it to get the list of files, or $ rmold.pl [dir] | xargs rm +trunc +===== +This small program may be used to create files of arbitrary size; useful +for testing certain scenarios using wget's --continue option. 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; +}