X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fvfs%2Funix.c;h=991d04a01a8f6b4c99ced2c7bb8a9cb9ff89e7e6;hp=789a13ecd10b1e7ab4eba4898fd3de27c8f74046;hb=2bf71d3ccf20c072bc67a9d075b6ac8b0798021e;hpb=4bd13980740c48d321a6fe2ca16ed0817c022fad diff --git a/libatalk/vfs/unix.c b/libatalk/vfs/unix.c index 789a13ec..991d04a0 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.9 2010-02-10 14:05:37 franklahm Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -83,12 +83,16 @@ 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; } @@ -97,14 +101,13 @@ int setfilmode(const char * name, mode_t mode, struct stat *st, mode_t v_umask) /* ------------------- system rmdir with afp error code. - ENOENT is not an error. */ -int netatalk_rmdir(const char *name) +int netatalk_rmdir_all_errors(const char *name) { if (rmdir(name) < 0) { switch ( errno ) { case ENOENT : - break; + return AFPERR_NOOBJ; case ENOTEMPTY : return AFPERR_DIRNEMPT; case EPERM: @@ -119,6 +122,18 @@ int netatalk_rmdir(const char *name) return AFP_OK; } +/* ------------------- + system rmdir with afp error code. + ENOENT is not an error. +*/ +int netatalk_rmdir(const char *name) +{ + int ret = netatalk_rmdir_all_errors(name); + if (ret == AFPERR_NOOBJ) + return AFP_OK; + return ret; +} + /* ------------------- system unlink with afp error code. ENOENT is not an error.