changeset 396:7ca3bef07f0d

Implement truncate.
author Rob Landley <rob@landley.net>
date Sun, 11 Dec 2011 03:58:43 -0600
parents 32c7b6af5b29
children b7afbc6b753a
files toys/truncate.c
diffstat 1 files changed, 47 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/truncate.c	Sun Dec 11 03:58:43 2011 -0600
@@ -0,0 +1,47 @@
+/* vi: set sw=4 ts=4:
+ *
+ * truncate.c - set file length, extending sparsely if necessary
+ *
+ * Copyright 2011 Rob Landley <rob@landley.net>
+ *
+ * Not in SUSv4
+
+USE_TRUNCATE(NEWTOY(truncate, "<1s#|c", TOYFLAG_BIN))
+
+config TRUNCATE
+	bool "truncate"
+	default y
+	help
+	  usage: truncate [-c] -s file...
+	  Set length of file(s), extending sparsely if necessary.
+
+	  -c	Don't create file if it doesn't exist.
+	  -s	New size
+*/
+
+#include "toys.h"
+
+DEFINE_GLOBALS(
+	long size;
+)
+
+#define TT this.truncate
+
+static void do_truncate(int fd, char *name)
+{
+	if (fd<0) return;
+	if (ftruncate(fd, TT.size)) {
+		perror_msg("failed to set '%s' to '%ld'", name, TT.size);
+		toys.exitval = EXIT_FAILURE;
+	}
+}
+
+void truncate_main(void)
+{
+	int cr = !(toys.optflags&1);
+
+	// Create files with mask rwrwrw.
+	// Nonexistent files are only an error if we're supposed to create them.
+	loopfiles_rw(toys.optargs, O_WRONLY|(cr ? O_CREAT : 0), 0666, cr,
+		do_truncate);
+}