/*
- * $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.
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;
}
/* -------------------
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:
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.