You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.6 KiB
66 lines
1.6 KiB
/* truncate.c - set file length, extending sparsely if necessary
|
|
*
|
|
* Copyright 2011 Rob Landley <rob@landley.net>
|
|
|
|
USE_TRUNCATE(NEWTOY(truncate, "<1s:|c", TOYFLAG_USR|TOYFLAG_BIN))
|
|
|
|
config TRUNCATE
|
|
bool "truncate"
|
|
default y
|
|
help
|
|
usage: truncate [-c] -s SIZE file...
|
|
|
|
Set length of file(s), extending sparsely if necessary.
|
|
|
|
-c Don't create file if it doesn't exist
|
|
-s New size (with optional prefix and suffix)
|
|
|
|
SIZE prefix: + add, - subtract, < shrink to, > expand to,
|
|
/ multiple rounding down, % multiple rounding up
|
|
SIZE suffix: k=1024, m=1024^2, g=1024^3, t=1024^4, p=1024^5, e=1024^6
|
|
*/
|
|
|
|
#define FOR_truncate
|
|
#include "toys.h"
|
|
|
|
GLOBALS(
|
|
char *s;
|
|
|
|
long size;
|
|
int type;
|
|
)
|
|
|
|
static void do_truncate(int fd, char *name)
|
|
{
|
|
long long size;
|
|
|
|
if (fd<0) return;
|
|
|
|
if (TT.type == -1) size = TT.size;
|
|
else {
|
|
size = fdlength(fd);
|
|
if (TT.type<2) size += TT.size*(1-(2*TT.type));
|
|
else if (TT.type<4) {
|
|
if ((TT.type==2) ? (size <= TT.size) : (size >= TT.size)) return;
|
|
size = TT.size;
|
|
} else {
|
|
size = (size+(TT.type-4)*(TT.size-1))/TT.size;
|
|
size *= TT.size;
|
|
}
|
|
}
|
|
if (ftruncate(fd, size)) perror_msg("'%s' to '%lld'", name, size);
|
|
}
|
|
|
|
void truncate_main(void)
|
|
{
|
|
int cr = !(toys.optflags&FLAG_c);
|
|
|
|
if (-1 != (TT.type = stridx("+-<>/%", *TT.s))) TT.s++;
|
|
TT.size = atolx(TT.s);
|
|
|
|
// Create files with mask rwrwrw.
|
|
// Nonexistent files are only an error if we're supposed to create them.
|
|
loopfiles_rw(toys.optargs, O_WRONLY|O_CLOEXEC|(cr ? O_CREAT|WARN_ONLY : 0),
|
|
0666, do_truncate);
|
|
}
|