diff options
author | joeyh <joeyh> | 2006-03-03 22:26:20 +0000 |
---|---|---|
committer | joeyh <joeyh> | 2006-03-03 22:26:20 +0000 |
commit | d8e27a6d4d287995a554f27605e912be38d0a75b (patch) | |
tree | 2f53a3af8babc5c1543736608c463cb35cd5cffc /sponge.c | |
parent | ee3eecafa0cc1a4efa0503117144205bedbdf6a1 (diff) | |
download | moreutils-d8e27a6d4d287995a554f27605e912be38d0a75b.tar.gz |
* Switch sponge to a C implementation by mithandir.
* Build dep on docbook-xml.
Diffstat (limited to 'sponge.c')
-rw-r--r-- | sponge.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sponge.c b/sponge.c new file mode 100644 index 0000000..db5e04e --- /dev/null +++ b/sponge.c @@ -0,0 +1,91 @@ +/* + * sponge.c - read in all available info from stdin, then output it to + * file named on the command line + * + * Copyright © 2006 Tollef Fog Heen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> + +void usage() { + printf("sponge <file>: suck in all input from stdin and write it to <file>"); + exit(0); +} + +int main(int argc, char **argv) { + char *buf, *bufstart; + size_t bufsize = 8192; + size_t bufused = 0; + ssize_t i = 0; + int outfd; + if (argc != 2) { + usage(); + } + + bufstart = buf = malloc(bufsize); + if (!buf) { + perror("malloc"); + exit(1); + } + + while ((i = read(0, buf, bufsize - bufused)) > 0) { + bufused = bufused+i; + if (bufused == bufsize) { + bufsize *= 2; + bufstart = realloc(bufstart, bufsize); + if (!bufstart) { + perror("realloc"); + exit(1); + } + + buf = bufstart + bufused; + } + } + if (i == -1) { + perror("read"); + exit(1); + } + + outfd = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY, + 0666); + if (outfd == -1) { + fprintf(stderr, "Can't open %s: %s\n", argv[1], strerror(errno)); + exit(1); + } + + i = write(outfd, bufstart, bufused); + if (i == -1) { + perror("write"); + exit(1); + } + + i = close(outfd); + if (i == -1) { + perror("close"); + exit(1); + } + + return 0; +} |