X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fvfs%2Funix.c;h=6679c296eac5d0fd22edb177e29e1145b73527e3;hp=789a13ecd10b1e7ab4eba4898fd3de27c8f74046;hb=1b20936596f89b2706f1122ca2fabad6ffe00c98;hpb=edefad2f0703ed2f6a21025d615600ed18c83d18 diff --git a/libatalk/vfs/unix.c b/libatalk/vfs/unix.c index 789a13ec..6679c296 100644 --- a/libatalk/vfs/unix.c +++ b/libatalk/vfs/unix.c @@ -1,5 +1,5 @@ /* - * $Id: unix.c,v 1.6 2009-10-27 10:24:02 franklahm Exp $ + * $Id: unix.c,v 1.6.2.1 2010-01-02 10:22:33 franklahm Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -83,11 +83,13 @@ int setfilmode(const char * name, mode_t mode, struct stat *st, mode_t v_umask) mode_t mask = S_IRWXU | S_IRWXG | S_IRWXO; /* rwx for owner group and other, by default */ if (!st) { - if (stat(name, &sb) != 0) + if (lstat(name, &sb) != 0) return -1; st = &sb; } + if (S_ISLNK(st->st_mode)) return 0; /* we don't want to change link permissions */ + mode |= st->st_mode & ~mask; /* keep other bits from previous mode */ if ( chmod( name, mode & ~v_umask ) < 0 && errno != EPERM ) { return -1;