++/* This returns a fully expanded filename for the merge-file name if the
++ * name has any slashes in it, otherwise it returns the original name. */
++static char *parse_merge_name(const char *merge_file, unsigned int *len_ptr)
++{
++ static char buf[MAXPATHLEN];
++ char *fn, tmpbuf[MAXPATHLEN];
++ unsigned int fn_len, cd_len;
++
++ cd_len = dirbuf_offset && *dirbuf == '/' ? 0 : curr_dir_len + 1;
++ if (cd_len && *merge_file != '/') {
++ const char *p;
++ if (len_ptr) {
++ for (p = merge_file + *len_ptr;
++ --p > merge_file && *p != '/'; ) {}
++ } else
++ p = strchr(merge_file, '/');
++ if (!p || p == merge_file)
++ return (char *)merge_file;
++ }
++
++ fn = *merge_file == '/' ? buf : tmpbuf;
++ if (sanitize_paths) {
++ /* null-terminate the name if it isn't already */
++ if (len_ptr && merge_file[*len_ptr]) {
++ char *to = fn == buf ? tmpbuf : buf;
++ strlcpy(to, merge_file, *len_ptr + 1);
++ merge_file = to;
++ }
++ dirbuf[dirbuf_offset] = '\0';
++ if (!sanitize_path(fn, merge_file, dirbuf)) {
++ rprintf(FERROR, "merge filename overflows: %s\n",
++ merge_file);
++ return NULL;
++ }
++ } else {
++ strlcpy(fn, merge_file, len_ptr ? *len_ptr + 1 : MAXPATHLEN);
++ clean_fname(fn);
++ }
++
++ if (*fn == '/')
++ return fn;
++
++ fn_len = strlen(fn);
++ if (cd_len + dirbuf_offset + fn_len >= MAXPATHLEN) {
++ rprintf(FERROR, "merge filename overflows: %s\n", fn);
++ return NULL;
++ }
++ if (cd_len) {
++ memcpy(buf, curr_dir, curr_dir_len);
++ buf[curr_dir_len] = '/';
++ }
++ if (dirbuf_offset)
++ memcpy(buf + cd_len, dirbuf, dirbuf_offset);
++ memcpy(buf + cd_len + dirbuf_offset, fn, fn_len + 1);
++ fn_len = clean_fname(buf);
++ if (len_ptr)
++ *len_ptr = fn_len;
++
++ return buf;
++}
++