--- amanda-2.4.3/recover-src/amrecover.c.guessdisk Tue Apr 8 17:20:31 2003 +++ amanda-2.4.3/recover-src/amrecover.c Wed Apr 9 10:52:24 2003 @@ -331,6 +331,7 @@ fsent.fsname ? fsent.fsname : "(fsname null)")); if ((current_length > longest_match) && (current_length <= cwd_length) + && (cwd_length == current_length || cwd[current_length]=='/') && (strncmp(fsent.mntdir, cwd, current_length) == 0)) { longest_match = current_length; @@ -364,20 +365,45 @@ return 0; } - /* have mount point now */ - /* disk name may be specified by mount point (logical name) or - device name, have to determine */ - printf("Trying disk %s ...\n", *mpt_guess); - disk_try = stralloc2("DISK ", *mpt_guess); /* try logical name */ - if (exchange(disk_try) == -1) - exit(1); - amfree(disk_try); - if (server_happy()) - { - *dn_guess = stralloc(*mpt_guess); /* logical is okay */ - amfree(fsname); - return 1; + /* we now know cwd is local, and we have its device and mount point */ + /* amanda disk is either the closest (longest) match of cwd in disklist + for this host, or the device name */ + + if (send_command("LISTDISK") == -1) + exit(1); + + printf("Looking for %s in disk list... \n", cwd); + longest_match = 0; + while (get_line() != -1 && server_line[3] == '-') { + char disk[1024]; + + if(sscanf(server_line, "201- %s", disk)>0) { + current_length = strlen(disk); + + dbprintf(("guess_disk: %d: %d: \"%s\" -> \"%s\"\n", + longest_match, current_length, + server_line, disk)); + + if ((current_length > longest_match) + && (current_length <= cwd_length) + && (cwd_length == current_length || cwd[current_length]=='/') + && (strncmp(disk, cwd, current_length) == 0)) { + longest_match = current_length; + amfree(*mpt_guess); + *mpt_guess = stralloc(disk); + + dbprintf(("guess_disk: *mpt_guess = %s\n", *mpt_guess, longest_match)); + } + } + amfree(server_line); + } + + if (longest_match > 0) { /* directory match found */ + *dn_guess = stralloc(*mpt_guess); + amfree(fsname); + return 1; } + printf("Trying disk %s ...\n", fsname); disk_try = stralloc2("DISK ", fsname); /* try device name */ if (exchange(disk_try) == -1)