when I try to patch I got
# patch -p0 < file_name_too_long.diff patching file rsync-2.5.6/receiver.c Hunk #1 FAILED at 166. 1 out of 1 hunk FAILED -- saving rejects to file rsync-2.5.6/receiver.c.rej
am I doing something wrong?
thanks
Luc
With this patch, I can successfully transfer a file that has a 255-char filename.
Only thing that may be a problem is the NAME_MAX thing, but that's a POSIX thing, so should be relatively safe (famous last words).
Paul Slootman
diff -ru orig/rsync-2.5.6/receiver.c rsync-2.5.6/receiver.c --- orig/rsync-2.5.6/receiver.c 2003-01-21 00:32:17.000000000 +0100 +++ rsync-2.5.6/receiver.c 2003-03-10 17:03:47.000000000 +0100 @@ -166,37 +166,49 @@
static int get_tmpname(char *fnametmp, char *fname) { - char *f; - - /* open tmp file */ - if (tmpdir) { - f = strrchr(fname,'/'); - if (f == NULL) - f = fname; - else - f++; - if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) { - rprintf(FERROR,"filename too long\n"); - return 0; - } - snprintf(fnametmp,MAXPATHLEN, "%s/.%s.XXXXXX",tmpdir,f); - return 1; - } - - f = strrchr(fname,'/'); + char *f; + int slash = 0; /* restore the '/' ? */ + char x = 0; /* restore the shortened name (with this?) */ + char *dir = ""; /* what dir to put the temp file in */ + + if (tmpdir) + dir = tmpdir; + f = strrchr(fname,'/'); /* is there a directory to skip in fname? */ + if (f == NULL) { + f = fname; /* no */ + } + else { + slash++; /* yes */ + *f = 0; + f++; + dir = fname; + }
- if (strlen(fname)+9 > MAXPATHLEN) { + if (strlen(dir)+strlen(f)+1 > MAXPATHLEN) { rprintf(FERROR,"filename too long\n"); return 0; }
- if (f) {
- *f = 0;
- snprintf(fnametmp,MAXPATHLEN,"%s/.%s.XXXXXX",
- fname,f+1);
+ if (strlen(f)+8 > NAME_MAX || strlen(dir)+strlen(f)+9 > MAXPATHLEN) {
+ /* temporarily shorten the name, it's just for a temp name anyway */
+ x = f[NAME_MAX-10];
+ f[NAME_MAX-10] = 0;
+ }
+
+ /* construct temp name template */
+ if (*dir) {
+ snprintf(fnametmp, MAXPATHLEN, "%s/.%s.XXXXXX", dir, f);
+ }
+ else {
+ snprintf(fnametmp, MAXPATHLEN, ".%s.XXXXXX", f);
+ }
+
+ if (x)
+ f[NAME_MAX-10] = x; /* restore the name if necessary */
+
+ if (slash) { /* restore slash if necessary */
+ f--;
*f = '/';
- } else {
- snprintf(fnametmp,MAXPATHLEN,".%s.XXXXXX",fname);
}
return 1;
--
To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html
-- To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html