/* * V2STRIP v0.2.7 Removes ID3v2 tags from MP3 files * * Copyright (C) 2000 Mats Peterson * * Please send any comments/bug reports to * mats_peterson@swipnet.se (Mats Peterson) */ #include #include #include #include #include "v2hdr.h" #define PACKAGE "v2strip" #define VERSION "0.2.7" #define BLKSIZE 4096 static void strip(char *fname) { FILE *in_f, *tmp_f; static char buf[BLKSIZE]; char *tmpname, *s; int n; long hdrsize; ID3V2HDR hdr; if (! (in_f = fopen(fname, "rb"))) { perror("fopen"); return; } fread(&hdr, sizeof(ID3V2HDR), 1, in_f); if (strncmp(hdr.id_str, "ID3", 3) || (hdr.version[0] == 0xff) || (hdr.version[1] == 0xff) || (hdr.size[0] >= 0x80) || (hdr.size[1] >= 0x80) || (hdr.size[2] >= 0x80) || (hdr.size[3] >= 0x80)) { fprintf(stderr, "Error: file '%s' does not have any valid ID3v2 tag\n", fname); fclose(in_f); return; } for (s = fname + strlen(fname) - 1; (s >= fname) && (*s != '\\'); s--); if (s < fname) tmpname = tempnam(".", "v2str"); else { /* *s == '\\' */ if (s == fname) { tmpname = tempnam("\\", "v2str"); } else { *s = '\0'; tmpname = tempnam(fname, "v2str"); *s = '\\'; } } if (! tmpname) { fprintf(stderr, "Error: unable to generate temporary file name\n"); fclose(in_f); return; } if (! (tmp_f = fopen(tmpname, "wb"))) { perror("fopen"); free(tmpname); fclose(in_f); return; } printf("Stripping %s... ", fname); fflush(stdout); hdrsize = ((long)hdr.size[3] | ((long)hdr.size[2] << (8 - 1)) | ((long)hdr.size[1] << (16 - 2)) | ((long)hdr.size[0] << (24 - 3))) + sizeof(ID3V2HDR); #ifdef DEBUG printf("header size: %lX\n", hdrsize); #endif fseek(in_f, hdrsize, SEEK_SET); while (1) { n = fread(buf, 1, BLKSIZE, in_f); if (ferror(in_f)) { fprintf(stderr, "Read error\n"); goto error; } fwrite(buf, 1, n, tmp_f); if (ferror(tmp_f)) { fprintf(stderr, "Write error\n"); goto error; } if (n < BLKSIZE) break; } fclose(in_f); fclose(tmp_f); if (remove(fname) == -1) { perror("remove"); goto error2; } if (rename(tmpname, fname) == -1) { perror("rename"); goto error2; } free(tmpname); printf("Done\n"); return; error: fclose(in_f); fclose(tmp_f); error2: remove(tmpname); free(tmpname); } static void usage(void) { fprintf(stderr, "%s v%s\n", PACKAGE, VERSION); fprintf(stderr, "usage: %s \n", PACKAGE); exit(0); } int main(int argc, char **argv) { struct ffblk ffblk; int i, done; if (argc == 1) usage(); for (i = 1; i < argc; i++) { if (strpbrk(argv[i], "?*")) { done = findfirst(argv[i], &ffblk, 0); if (done) { fprintf(stderr, "Can't find any file matching '%s'\n", argv[i]); continue; } while (! done) { strip(ffblk.ff_name); done = findnext(&ffblk); } } else strip(argv[i]); } return 0; } .