On Sat, Nov 26, 2005 at 08:24:32PM +0100, Amaya wrote: > Sorry, Wouter > > I cannot find a use for the patch you sent me. > It patches files under debian/perforate/DEBIAN/ and I can't make any > sense of it.
Thing is, I made the mistake of diffing a clean build directory against one in which I had just built the package (to test). My mistake :-) The only relevant changes are the ones to zum.c (though the debian/rules changes that I made might also be of interest): diff -ruN perforate-1.1/zum.c perforate-1.1.mine/zum.c --- perforate-1.1/zum.c 1996-09-11 00:15:34.000000000 +0200 +++ perforate-1.1.mine/zum.c 2005-11-11 11:02:27.000000000 +0100 @@ -2,6 +2,8 @@ * zum 1.00 - free more disk space by making holes in files. * * Oleg Kibirev * April 1995 * [EMAIL PROTECTED] + * 2005-11-11: Wouter Verhelst <[EMAIL PROTECTED]>: clean up the code a bit (so + * that it no longer produces any warnings, add large file support. * * This code is covered by General Public License, version 2 or any later * version of your choice. You should recieve file "COPYING" which contains @@ -9,7 +11,11 @@ * have it, a copy is available from ftp.gnu.ai.mit.edu. */ +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE_SOURCE + #include <stdio.h> +#include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/file.h> @@ -25,10 +31,26 @@ static char suffix[] = "__zum__"; -static int zero_copy(int fds, int fdd, int size) +static void* my_mmap(void *ptr, int fd, off_t size, off_t *pos) +{ + if(size-(*pos) > (off_t)1<<30) { + size=1<<30; + } else { + size=size-(*pos); + } + if(ptr) + munmap(ptr, 1<<30); + ptr=mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, (*pos)); + (*pos)+=size; + return ptr; +} + +static int zero_copy(int fds, int fdd, off_t size) { char *ms; char *bp, *p, *ep; + off_t pos=0; + int offset; lseek(fdd, 0L, SEEK_SET); if(ftruncate(fdd, 0) < 0) { @@ -36,23 +58,33 @@ return -1; } - if((ms = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fds, 0)) == -1) { + offset = (size > 1<<30) ? 1<<30 : size; + if((ms = my_mmap(NULL, fds, size, &pos)) == MAP_FAILED) { perror("mmap"); return -1; } - p = ms; ep = ms + size; + p = ms; ep = ms + offset; while(p < ep) { for(bp = p; p < ep && *p; p++); if(p != bp && write(fdd, bp, p-bp) != p-bp) { perror("write"); - munmap(ms, size); + munmap(ms, offset); return -1; } for(bp = p; p < ep && !*p; p++); if(p != bp) lseek(fdd, p-bp, SEEK_CUR); + if((p == ep) && (size > 1<<30) && (size != pos)) { + offset = ((size - pos) > 1<<30) ? 1<<30 : (size - pos); + if((ms = my_mmap(ms, fds, size, &pos)) == MAP_FAILED) { + perror("mmap"); + return -1; + } else { + p = ms; ep = ms + offset; + } + } } munmap(ms, size); return ftruncate(fdd, size); @@ -102,7 +134,7 @@ return; } - printf(" [%uK] ", (st.st_blocks-std.st_blocks)*st.st_blksize/1024); + printf(" [%uK] ", (unsigned int)((st.st_blocks-std.st_blocks)*st.st_blksize/1024)); fflush(stdout); if(st.st_nlink == 1) { @@ -141,16 +173,16 @@ } } -main(int argc, char **argv) +int main(int argc, char **argv) { char *p; if(argc > 1) - while(p = *(++argv)) + while((p = *(++argv))) zero_unmap(p); else { char buf[MAXPATHLEN]; - while(gets(buf)) + while(fgets(buf, MAXPATHLEN, stdin)) zero_unmap(buf); } return 0; -- .../ -/ ---/ .--./ / .--/ .-/ .../ -/ ../ -./ --./ / -.--/ ---/ ..-/ .-./ / -/ ../ --/ ./ / .--/ ../ -/ ..../ / -../ ./ -.-./ ---/ -../ ../ -./ --./ / --/ -.--/ / .../ ../ --./ -./ .-/ -/ ..-/ .-./ ./ .-.-.-/ / --/ ---/ .-./ .../ ./ / ../ .../ / ---/ ..-/ -/ -../ .-/ -/ ./ -../ / -/ ./ -.-./ ..../ -./ ---/ .-../ ---/ --./ -.--/ / .-/ -./ -.--/ .--/ .-/ -.--/ .-.-.-/ / ...-.-/ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]