File name too long
Paul Slootman
paul at debian.org
Tue Mar 11 20:47:10 EST 2003
On Tue 11 Mar 2003, jw schultz wrote:
>
> That or char fscratch[MAXPATHLEN];
> Just don't use malloc.
How about this:
static int get_tmpname(char *fnametmp, char *fname)
{
char *f;
char *dir = ""; /* what dir to put the temp file in */
char namepart[NAME_MAX-10]; /* we never need more than this, if */
/* the name is longer, we would end */
/* up having to shorten it anyway */
if (tmpdir)
dir = tmpdir;
f = strrchr(fname,'/'); /* is there a directory to skip in fname? */
if (f == NULL) { /* no */
/* the strlcpy takes care of making the name short enough */
/* and null-terminating it at the same time. */
strlcpy(namepart, fname, sizeof(namepart));
}
else { /* yes */
strlcpy(namepart, f+1, sizeof(namepart));
}
if (strlen(dir)+strlen(namepart)+1 > MAXPATHLEN) {
/* how often will this happen... the temp dir would have to */
/* a very long name, and hence the fault of the user who */
/* specified it. Let him fix the problem. */
rprintf(FERROR,"filename too long\n");
return 0;
}
/* construct temp name template */
snprintf(fnametmp, MAXPATHLEN, "%s%s.%s.XXXXXX",
dir, dir[0]?"/":"", namepart);
return 1;
}
Even shorter than it was, it should now be difficult to mess this up :-)
I thought of letting the default value of dir be "./", but then
clean_fname would end up shifting that off again, thus wasting
resources.
Paul Slootman
More information about the rsync
mailing list