#include "tag.h" int move(int fd, long to, long from) { char buf[16*1024]; int n; if(to > from) abort(); while((n = pread(fd, buf, sizeof buf, from)) > 0) { if(pwrite(fd, buf, n, to) < n) { werrstr("write: %r"); return -1; } to += n; from += n; } if(n < 0) { werrstr("read: %r"); return -1; } return 0; } void usage(void) { fprint(2, "usage: %s file\n", argv0); exits("usage"); } void main(int argc, char **argv) { uchar buf[HeaderSize], *p; int fd; Header hdr; Dir *dir; vlong newlength; ARGBEGIN { default: usage(); } ARGEND if(argc != 1) usage(); if((fd = open(argv[0], ORDWR)) < 0) sysfatal("open %s: %r", argv[0]); if(readn(fd, buf, HeaderSize) < 0) sysfatal("couldn't read header: %r"); p = buf; gheader(&p, &hdr); if(strcmp(hdr.magic, "ID3") == 0) { if((dir = dirfstat(fd)) == nil) sysfatal("stat %s: %r", argv[0]); if(move(fd, 0, HeaderSize + hdr.length) < 0) sysfatal("move: %r"); newlength = dir->length - (HeaderSize + hdr.length); nulldir(dir); dir->length = newlength; if(dirfwstat(fd, dir) < 0) sysfatal("wstat %s: %r", argv[0]); } exits(nil); } // FIXME -- only tags at the beginning of the file will be removed