Commit bd9be35c authored by Timo Teräs's avatar Timo Teräs

abuild-tar: rename cutting option to --cut, full_{read,write,splice}

parent f2211474
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h>
#include <stdint.h>
#include <getopt.h> #include <getopt.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
...@@ -101,6 +103,68 @@ static int usage(void) ...@@ -101,6 +103,68 @@ static int usage(void)
"\n"); "\n");
} }
static ssize_t full_read(int fd, void *buf, size_t count)
{
ssize_t total, n;
total = 0;
do {
n = read(fd, buf, count);
if (n < 0 && errno == EINTR)
continue;
if (n <= 0)
break;
buf += n;
count -= n;
} while (1);
if (total == 0 && n < 0)
return -1;
return total;
}
static ssize_t full_write(int fd, const void *buf, size_t count)
{
ssize_t total, n;
total = 0;
do {
n = write(fd, buf, count);
if (n < 0 && errno == EINTR)
continue;
if (n <= 0)
break;
buf += n;
count -= n;
} while (1);
if (total == 0 && n < 0)
return -1;
return total;
}
static ssize_t full_splice(int from_fd, int to_fd, size_t count)
{
ssize_t total, n;
total = 0;
do {
n = splice(from_fd, NULL, to_fd, count, 0);
if (n < 0 && errno == EINTR)
continue;
if (n <= 0)
break;
count -= n;
} while (1);
if (total == 0 && n < 0)
return -1;
return total;
}
static int do_it(const EVP_MD *md, int cut) static int do_it(const EVP_MD *md, int cut)
{ {
struct tar_header hdr; struct tar_header hdr;
...@@ -120,7 +184,7 @@ static int do_it(const EVP_MD *md, int cut) ...@@ -120,7 +184,7 @@ static int do_it(const EVP_MD *md, int cut)
} }
do { do {
if (read(STDIN_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr)) if (full_read(STDIN_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr))
return 0; return 0;
if (cut && hdr.name[0] == 0) if (cut && hdr.name[0] == 0)
...@@ -136,7 +200,7 @@ static int do_it(const EVP_MD *md, int cut) ...@@ -136,7 +200,7 @@ static int do_it(const EVP_MD *md, int cut)
int chksum, i; int chksum, i;
ptr = malloc(aligned_size); ptr = malloc(aligned_size);
if (read(STDIN_FILENO, ptr, aligned_size) != aligned_size) if (full_read(STDIN_FILENO, ptr, aligned_size) != aligned_size)
return 1; return 1;
memcpy(&hdr.linkname[3], &mdinfo, sizeof(mdinfo)); memcpy(&hdr.linkname[3], &mdinfo, sizeof(mdinfo));
...@@ -151,21 +215,20 @@ static int do_it(const EVP_MD *md, int cut) ...@@ -151,21 +215,20 @@ static int do_it(const EVP_MD *md, int cut)
put_octal(hdr.chksum, sizeof(hdr.chksum)-1, chksum); put_octal(hdr.chksum, sizeof(hdr.chksum)-1, chksum);
} }
if (write(STDOUT_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr)) if (full_write(STDOUT_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr))
return 2; return 2;
if (dohash) { if (dohash) {
if (write(STDOUT_FILENO, ptr, aligned_size) != aligned_size) if (full_write(STDOUT_FILENO, ptr, aligned_size) != aligned_size)
return 2; return 2;
free(ptr); free(ptr);
} else if (aligned_size != 0) { } else if (aligned_size != 0) {
r = splice(STDIN_FILENO, NULL, STDOUT_FILENO, NULL, r = full_splice(STDIN_FILENO, STDOUT_FILENO, aligned_size);
aligned_size, 0);
if (r == -1) { if (r == -1) {
while (aligned_size > 0) { while (aligned_size > 0) {
if (read(STDIN_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr)) if (full_read(STDIN_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr))
return 1; return 1;
if (write(STDOUT_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr)) if (full_write(STDOUT_FILENO, &hdr, sizeof(hdr)) != sizeof(hdr))
return 2; return 2;
aligned_size -= sizeof(hdr); aligned_size -= sizeof(hdr);
} }
...@@ -180,7 +243,7 @@ int main(int argc, char **argv) ...@@ -180,7 +243,7 @@ int main(int argc, char **argv)
static int cut = 0; static int cut = 0;
static const struct option options[] = { static const struct option options[] = {
{ "hash", optional_argument }, { "hash", optional_argument },
{ "no-end", no_argument, &cut, 1 }, { "cut", no_argument, &cut, 1 },
{ NULL } { NULL }
}; };
const EVP_MD *md = NULL; const EVP_MD *md = NULL;
...@@ -196,8 +259,6 @@ int main(int argc, char **argv) ...@@ -196,8 +259,6 @@ int main(int argc, char **argv)
digest = optarg ? optarg : "sha1"; digest = optarg ? optarg : "sha1";
} }
fprintf(stderr, "digest: %s, cut: %d\n", digest, cut);
if (digest == NULL && cut == 0) if (digest == NULL && cut == 0)
return usage(); return usage();
if (isatty(STDIN_FILENO)) if (isatty(STDIN_FILENO))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment