shithub: scc

Download patch

ref: ed6c62e1aaa3d627ffceb0008d1f783600257cbb
parent: fc3cb31e545ef5afe71e155275e2bb454491e0d1
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Feb 13 09:15:19 EST 2018

[ar] Add -p print key

--- a/ar/main.c
+++ b/ar/main.c
@@ -207,54 +207,59 @@
 	return buf;
 }
 
-static long long
-unixtime(struct ar_hdr *hdr)
+static int
+inlist(char *fname, char *list[])
 {
-	long long t;
-	int c, siz = sizeof(hdr->ar_date);
-	char *p, *q;
-	static char digits[] = "0123456789";
+	while (*list && strcmp(*list, fname))
+		++list;
+	return *list != NULL;
+}
 
-	p = hdr->ar_date;
-	for (t = 0; siz-- > 0; t += c) {
-		if ((c = *p++) == ' ')
-			break;
-		if ((q = strchr(digits, c)) == NULL) {
-			fputs("ar:corrupted header\n", stderr);
-			exit(1);
-		}
-		t *= 10;
-		c = q - digits;
+static void
+print(struct arop *op, char *files[])
+{
+	long siz;
+	int c;
+
+	if (*files && !inlist(op->fname, files))
+		return;
+	if (vflag)
+		printf("\n<%s>\n\n", op->fname);
+	siz = atol(op->hdr.ar_size);
+	if (siz < 0) {
+		fputs("ar:corrupted member\n", stderr);
+		exit(1);
 	}
-	return t;
+	while (siz-- > 0 && (c = getc(op->src)) != EOF)
+		putchar(c);
 }
 
 static void
 list(struct arop *op, char *files[])
 {
-	int print = 0;
-	char **bp;
+	long long val;
 	time_t t;
 	struct ar_hdr *hdr = &op->hdr;
 	char mtime[30];
 
-	if (*files == NULL) {
-		print = 1;
-	} else {
-		for (bp = files; *bp && strcmp(*bp, op->fname); ++bp)
-			;
-		print = *bp != NULL;
-	}
+	if (*files && !inlist(op->fname, files))
+		return;
 	if (!print)
 		return;
 	if (!vflag) {
 		printf("%s\n", op->fname);
 	} else {
-		t = totime(unixtime(hdr));
+		val = atoll(hdr->ar_date);
+		if (val < 0) {
+			fputs("ar:corrupted member\n", stderr);
+			exit(1);
+		}
+		t = totime(val);
 		strftime(mtime, sizeof(mtime), "%c", localtime(&t));
 		printf("%s %d/%d\t%s %s\n",
 		       perms(hdr),
-		       atol(hdr->ar_uid), atol(hdr->ar_gid),
+		       atol(hdr->ar_uid),
+		       atol(hdr->ar_gid),
 		       mtime,
 		       op->fname);
 	}
@@ -263,11 +268,7 @@
 static void
 del(struct arop *op, char *files[])
 {
-	char **bp;
-
-	for (bp = files; *bp && strcmp(*bp, op->fname); ++bp)
-		;
-	if (*bp)
+	if (inlist(op->fname, files))
 		return;
 	copymember(op->fname, &op->hdr, op->dst, op->src);
 }
@@ -467,8 +468,10 @@
 		tmp = NULL;
 		fun = list;
 		break;
-	case 'r':
 	case 'p':
+		tmp = NULL;
+		fun = print;
+	case 'r':
 	case 'm':
 	case 'x':
 		/* TODO */