Ticket #10: fix-stalls-on-symlinks-rev2.patch

File fix-stalls-on-symlinks-rev2.patch, 1.9 KB (added by Patrick Winnertz, 10 years ago)

Added by email2trac

  • vfs/fish.c

    diff --git a/vfs/fish.c b/vfs/fish.c
    index 2a2deb6..cec0cf7 100644
    a b fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    369369            "#LIST /%s\n" 
    370370            "if ls -1 /%s >/dev/null 2>&1 ;\n" 
    371371            "then\n" 
    372             "ls -lLan /%s 2>/dev/null | grep '^[^cbt]' | (\n" 
     372            "ls -lan /%s 2>/dev/null | grep '^[^cbt]' | (\n" 
    373373              "while read p l u g s m d y n; do\n" 
    374374                "echo \"P$p $u.$g\nS$s\nd$m $d $y\n:$n\n\"\n" 
    375375              "done\n" 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    412412 
    413413        switch(buffer[0]) { 
    414414        case ':': { 
    415                       if (!strcmp(buffer+1, ".") || !strcmp(buffer+1, "..")) 
    416                           break;  /* We'll do . and .. ourself */ 
    417                       ent->name = g_strdup(buffer+1);  
    418                       break; 
    419                   } 
     415            char *copy_buffer = buffer+1; 
     416                char *foobar; 
     417                int seen = 0; 
     418            char *filename = buffer+1; 
     419            char *linkname = buffer+1; 
     420            if (!strcmp(buffer+1, ".") || !strcmp(buffer+1, "..")) 
     421                        break;  /* We'll do . and .. ourself */ 
     422 
     423                if (S_ISLNK(ST.st_mode)) { 
     424                        while (*copy_buffer){ 
     425                                if (strncmp(copy_buffer," -> ",4)==0) 
     426                                        filename = copy_buffer; 
     427                                copy_buffer++; 
     428                        } 
     429                        int f_size = filename - linkname; 
     430                        ent->name = malloc(f_size+1); 
     431                        strncpy(ent->name,linkname,f_size); 
     432                        ent->name[f_size] = '\0'; 
     433                        ent->ino->linkname = strdup(filename + 4); 
     434            } else { 
     435                ent->name = g_strdup(buffer+1); 
     436            } 
     437            break; 
     438        } 
    420439        case 'S': 
    421440#ifdef HAVE_ATOLL 
    422441            ST.st_size = (off_t) atoll (buffer+1); 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    426445            break; 
    427446        case 'P': { 
    428447            size_t skipped; 
    429  
    430             if (vfs_parse_filemode (buffer + 1, &skipped, &ST.st_mode)) { 
    431                 if (S_ISLNK(ST.st_mode)) 
    432                     ST.st_mode = 0; 
    433             } 
     448            vfs_parse_filemode (buffer + 1, &skipped, &ST.st_mode); 
    434449            break; 
    435450        } 
    436451        case 'd': {