1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

Added util/trunc.

This commit is contained in:
Micah Cowan 2008-02-03 16:10:34 -08:00
parent c1b7382ec4
commit e65c797cc6
5 changed files with 144 additions and 0 deletions

View File

@ -61,5 +61,8 @@ po/remove-potcdate.sed
po/stamp-po po/stamp-po
po/en@boldquot.insert-header po/en@boldquot.insert-header
po/en@quot.insert-header po/en@quot.insert-header
util/trunc
util/trunc.o
util/.deps
**~ **~
**.*.swp **.*.swp

View File

@ -3,6 +3,9 @@
* configure.in: Add checks for wchar.h, wcwidth function (to * configure.in: Add checks for wchar.h, wcwidth function (to
support column-counting in progress.c). support column-counting in progress.c).
* NEWS: Added line for 1.11.1. * 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 <micah@cowan.name> 2008-01-31 Micah Cowan <micah@cowan.name>

View File

@ -30,3 +30,5 @@
# #
EXTRA_DIST = README rmold.pl EXTRA_DIST = README rmold.pl
bin_PROGRAMS = trunc

View File

@ -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 the remote server. You can use it to get the list of files, or
$ rmold.pl [dir] | xargs rm $ 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.

132
util/trunc.c Normal file
View File

@ -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 <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#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;
}