Update chmodzip to current dmd

This commit is contained in:
Walter Bright 2013-12-27 15:57:22 -08:00
parent 726d399b68
commit ede62ef857

View file

@ -1,9 +1,9 @@
import std.c.stdio; import core.stdc.stdlib;
import std.c.stdlib; import std.conv;
import std.stdio; import std.stdio;
import std.file; import std.file;
import std.date; import std.datetime;
import std.zip; import std.zip;
import std.zlib; import std.zlib;
@ -11,8 +11,8 @@ int main(string[] args)
{ {
if (args.length == 1) if (args.length == 1)
{ {
writeln("Usage: zip zipfile attr members..."); stderr.writeln("Usage: zip zipfile attr members...");
exit(0); return EXIT_FAILURE;
} }
if (args.length == 2) if (args.length == 2)
@ -35,7 +35,8 @@ int main(string[] args)
writefln("\tcompressedSize = %s", de.compressedSize); writefln("\tcompressedSize = %s", de.compressedSize);
writefln("\teattr = %03o, %03o", de.externalAttributes >> 16, de.externalAttributes & 0xFFFF); writefln("\teattr = %03o, %03o", de.externalAttributes >> 16, de.externalAttributes & 0xFFFF);
writefln("\tiattr = %03o", de.internalAttributes); writefln("\tiattr = %03o", de.internalAttributes);
writefln("\tdate = %s", std.date.toString(std.date.toDtime(de.time))); //writefln("\tdate = %s", std.date.toString(std.date.toDtime(de.time)));
writefln("\tdate = %s", SysTime(unixTimeToStdTime((de.time))));
} }
return 0; return 0;
} }
@ -55,16 +56,15 @@ int main(string[] args)
auto buffer = cast(byte[])std.file.read(zipname); auto buffer = cast(byte[])std.file.read(zipname);
auto zr = new std.zip.ZipArchive(cast(void[])buffer); auto zr = new std.zip.ZipArchive(cast(void[])buffer);
L1:
foreach (member; members) foreach (member; members)
{ {
foreach (ArchiveMember de; zr.directory) foreach (ArchiveMember de; zr.directory)
{ {
if (de.name == member) if (de.name == member)
goto L1; continue L1;
} }
throw new ZipException(member ~ " not in zipfile " ~ zipname); throw new ZipException(member ~ " not in zipfile " ~ zipname);
L1:
;
} }
bool changes; bool changes;
@ -74,17 +74,19 @@ int main(string[] args)
foreach (member; members) foreach (member; members)
{ {
if (de.name == member && ((de.externalAttributes >> 16) & 07777) != newattr) if (de.name == member && ((de.externalAttributes >> 16) & octal!7777) != newattr)
{ changes = true; {
de.madeVersion = 0x317; // necessary or linux unzip will ignore attributes changes = true;
de.externalAttributes = (de.externalAttributes & ~(07777 << 16)) | (newattr << 16); de._madeVersion = 0x317; // necessary or linux unzip will ignore attributes
de.externalAttributes = (de.externalAttributes & ~(octal!7777 << 16)) | (newattr << 16);
break; break;
} }
} }
} }
if (changes) if (changes)
{ void[] data2 = zr.build(); {
void[] data2 = zr.build();
std.file.write(zipname, cast(byte[])data2); std.file.write(zipname, cast(byte[])data2);
} }
return 0; return 0;