shithub: s3

Download patch

ref: ff8248458f3c941e86c87ac191cb007453a61fdd
parent: 685a897dc19fec1e4f4b7ebeee0aac6b07c520a5
author: Jacob Moody <moody@posixcafe.org>
date: Wed Sep 24 17:26:25 EDT 2025

provide a way of cleaning up zombie multipart uploads

--- a/ls.c
+++ b/ls.c
@@ -54,7 +54,7 @@
 		sysfatal("Bfdopen: %r");
 	x = xmlread(b[1], 0);
 	if(x == nil)
-		sysfatal("file was not valid XML, maybe not a prefix?");
+		sysfatal("response was not valid XML, maybe not a prefix?");
 	if((x = xmlget(x, "Contents", nil)) == nil)
 		sysfatal("xml did not have Contents field");
 
--- a/rm.c
+++ b/rm.c
@@ -30,6 +30,6 @@
 	if(parseuri(&s3, path, sizeof path, argv[0]) < 0)
 		usage();
 	if(s3del(&s3, &con, path) < 0)
-		sysfatal("could not buld request: %r");
+		sysfatal("could not build request: %r");
 	exits(nil);
 }
--- a/write.c
+++ b/write.c
@@ -10,7 +10,7 @@
 _Noreturn void
 usage(void)
 {
-	fprint(2, "Usage %s: s3://bucket/dir\n", argv0);
+	fprint(2, "Usage %s: [-l] s3://bucket/dir\n", argv0);
 	exits("usage");
 }
 
@@ -82,7 +82,7 @@
 main(int argc , char **argv)
 {
 	S3 s3;
-	int i, partno;
+	int lflag, partno;
 	char path[512];
 	int p[2];
 	Biobuf *b[2];
@@ -94,11 +94,15 @@
 	tmfmtinstall();
 	fmtinstall('H', encodefmt);
 	quotefmtinstall();
-	i = parseargs(&s3, argc, argv);
-	argc -= i;
-	argv += i;
+	parseargs(&s3, argc, argv);
+	lflag = 0;
+	ARGBEGIN{
+	case 'l':
+		lflag++;
+		break;
+	}ARGEND
 
-	if(argc == 0)
+	if(!lflag && argc == 0)
 		usage();
 	if(parseuri(&s3, path, sizeof path, argv[0]) < 0)
 		usage();
@@ -112,11 +116,10 @@
 		b[0] = Bfdopen(p[0], OWRITE);
 		if(b[0] == nil)
 			sysfatal("Bfdopen: %r");
-		download(&s3, smprint("%s?uploads=", path), b[0], s3post);
+		download(&s3, smprint("%s?uploads=", path), b[0], lflag ? s3get : s3post);
 		Bterm(b[0]);
 		exits(nil);
 	default:
-		waitpid();
 		close(p[0]);
 		break;
 	}
@@ -125,11 +128,15 @@
 		sysfatal("Bfdopen: %r");
 	x = xmlread(b[1], 0);
 	if(x == nil)
-		sysfatal("file was not valid XML, maybe not a prefix?");
+		sysfatal("response was not valid XML");
+	if(lflag){
+		x = xmlget(x, "Upload", nil);
+		for(; x != nil && xmlget(x, "UploadId", nil) != nil; x = x->next)
+			print("s3/rm 's3://%s/%s?uploadId=%s'\n", s3.bucket, xmlget(x, "Key", nil)->v, xmlget(x, "UploadId", nil)->v);
+		exits(nil);
+	}
 	if((x = xmlget(x, "UploadId", nil)) == nil)
 		sysfatal("xml did not have UploadId field");
-
-	/* print("%s\n", x->v); */
 
 	for(len = 0, partno = 1;;){
 		n = read(0, bb, sizeof bb - len);
--