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);
--
⑨