I assume there's some good reason for the way filenames are faithfully maintained as temp files, but it's a little frustrating when you get "filename too long" messages as a result... with no indication of what file it was it's complaining about.
The obvious fix is to simply generate a tmpname and have done with it. Possibly safer, truncate the filename, in case there's some reason for the filename being maintained (to restart the download? I don't know, it seems like this would fail for files in tmpdir...). Anyway... --- rsync-2.5.6-orig/receiver.c Mon Jan 20 23:32:17 2003 +++ rsync-2.5.6/receiver.c Mon Aug 25 10:13:37 2003 @@ -163,33 +163,51 @@ } } - static int get_tmpname(char *fnametmp, char *fname) { - char *f; + char *f, holder; + size_t len; + + if(strlen(fname) > MAXPATHLEN) { + rprintf(FERROR,"%s: filename too long\n", fname); + return 0; + } + + holder = 0; /* open tmp file */ if (tmpdir) { + int tlen; f = strrchr(fname,'/'); if (f == NULL) f = fname; else f++; - if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) { - rprintf(FERROR,"filename too long\n"); + tlen = strlen(tmpdir) + 10; + if(tlen > MAXPATHLEN) { + rprintf(FERROR,"%s: filename too long\n", tmpdir); return 0; } + len = strlen(f); + if (len + tlen > MAXPATHLEN) { + len = MAXPATHLEN - tlen; + holder = f[len]; + f[len] = 0; + } snprintf(fnametmp,MAXPATHLEN, "%s/.%s.XXXXXX",tmpdir,f); + if(holder) f[len] = holder; return 1; } - f = strrchr(fname,'/'); - - if (strlen(fname)+9 > MAXPATHLEN) { - rprintf(FERROR,"filename too long\n"); - return 0; + len = strlen(fname); + if (len + 10 > MAXPATHLEN) { + len = MAXPATHLEN - 10; + holder = fname[len]; + fname[len] = 0; } + f = strrchr(fname,'/'); + if (f) { *f = 0; snprintf(fnametmp,MAXPATHLEN,"%s/.%s.XXXXXX", @@ -198,6 +216,7 @@ } else { snprintf(fnametmp,MAXPATHLEN,".%s.XXXXXX",fname); } + if(holder) fname[len] = holder; return 1; } -- To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html