X-Git-Url: https://arthur.barton.de/gitweb/?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fvfs%2Fea_sys.c;h=0b899903ee433a0a70f50a9ffb0cab0cd96df406;hp=5b210d81de9042d9227bbd793d7dce0de9e07eb1;hb=e9f068edf57818b75adccf5ef0ad72d54797c81d;hpb=14874ef66d68c5200a9a42a7408d022d58211898 diff --git a/libatalk/vfs/ea_sys.c b/libatalk/vfs/ea_sys.c index 5b210d81..0b899903 100644 --- a/libatalk/vfs/ea_sys.c +++ b/libatalk/vfs/ea_sys.c @@ -81,14 +81,17 @@ int sys_get_easize(VFS_FUNC_ARGS_EA_GETSIZE) switch(errno) { case OPEN_NOFOLLOW_ERRNO: /* its a symlink and client requested O_NOFOLLOW */ - LOG(log_debug, logtype_afpd, "sys_getextattr_size(%s): encountered symlink with kXAttrNoFollow", uname); - return AFP_OK; + LOG(log_debug, logtype_afpd, "sys_getextattr_size(%s): symlink with kXAttrNoFollow", uname); + return AFPERR_MISC; case ENOATTR: + case ENOENT: + if (vol->v_obj->afp_version >= 34) + return AFPERR_NOITEM; return AFPERR_MISC; default: - LOG(log_error, logtype_afpd, "sys_getextattr_size: error: %s", strerror(errno)); + LOG(log_debug, logtype_afpd, "sys_getextattr_size: error: %s", strerror(errno)); return AFPERR_MISC; } } @@ -156,14 +159,16 @@ int sys_get_eacontent(VFS_FUNC_ARGS_EA_GETCONTENT) switch(errno) { case OPEN_NOFOLLOW_ERRNO: /* its a symlink and client requested O_NOFOLLOW */ - LOG(log_debug, logtype_afpd, "sys_getextattr_content(%s): encountered symlink with kXAttrNoFollow", uname); - return AFP_OK; + LOG(log_debug, logtype_afpd, "sys_getextattr_content(%s): symlink with kXAttrNoFollow", uname); + return AFPERR_MISC; case ENOATTR: + if (vol->v_obj->afp_version >= 34) + return AFPERR_NOITEM; return AFPERR_MISC; default: - LOG(log_error, logtype_afpd, "sys_getextattr_content(%s): error: %s", attruname, strerror(errno)); + LOG(log_debug, logtype_afpd, "sys_getextattr_content(%s): error: %s", attruname, strerror(errno)); return AFPERR_MISC; } } @@ -219,17 +224,13 @@ int sys_list_eas(VFS_FUNC_ARGS_EA_LIST) if (ret == -1) switch(errno) { case OPEN_NOFOLLOW_ERRNO: - /* its a symlink and client requested O_NOFOLLOW */ - ret = AFPERR_BADTYPE; - goto exit; -#ifdef HAVE_ATTROPEN /* Solaris */ - case ENOATTR: + /* its a symlink and client requested O_NOFOLLOW, we pretend 0 EAs */ + LOG(log_debug, logtype_afpd, "sys_list_extattr(%s): symlink with kXAttrNoFollow", uname); ret = AFP_OK; goto exit; -#endif default: - LOG(log_error, logtype_afpd, "sys_list_extattr(%s): error opening atttribute dir: %s", uname, strerror(errno)); - ret= AFPERR_MISC; + LOG(log_debug, logtype_afpd, "sys_list_extattr(%s): error opening atttribute dir: %s", uname, strerror(errno)); + ret = AFPERR_MISC; goto exit; } @@ -309,15 +310,20 @@ int sys_set_ea(VFS_FUNC_ARGS_EA_SET) switch(errno) { case OPEN_NOFOLLOW_ERRNO: /* its a symlink and client requested O_NOFOLLOW */ - LOG(log_debug, logtype_afpd, "sys_set_ea(\"%s/%s\", ea:'%s'): encountered symlink with kXAttrNoFollow", - getcwdpath(), uname, attruname); + LOG(log_debug, logtype_afpd, "sys_set_ea(\"%s\", ea:'%s'): symlink with kXAttrNoFollow", + uname, attruname); return AFP_OK; case EEXIST: LOG(log_debug, logtype_afpd, "sys_set_ea(\"%s/%s\", ea:'%s'): EA already exists", getcwdpath(), uname, attruname); return AFPERR_EXIST; + case ENOATTR: + case ENOENT: + if ((attr_flag & XATTR_REPLACE) && (vol->v_obj->afp_version >= 34)) + return AFPERR_NOITEM; + return AFPERR_MISC; default: - LOG(log_error, logtype_afpd, "sys_set_ea(\"%s/%s\", ea:'%s', size: %u, flags: %s|%s|%s): %s", + LOG(log_debug, logtype_afpd, "sys_set_ea(\"%s/%s\", ea:'%s', size: %u, flags: %s|%s|%s): %s", getcwdpath(), uname, attruname, attrsize, oflag & O_CREAT ? "XATTR_CREATE" : "-", oflag & O_TRUNC ? "XATTR_REPLACE" : "-", @@ -363,13 +369,10 @@ int sys_remove_ea(VFS_FUNC_ARGS_EA_REMOVE) switch(errno) { case OPEN_NOFOLLOW_ERRNO: /* its a symlink and client requested O_NOFOLLOW */ - LOG(log_debug, logtype_afpd, "sys_remove_ea(%s/%s): encountered symlink with kXAttrNoFollow", uname); + LOG(log_debug, logtype_afpd, "sys_remove_ea(%s/%s): symlink with kXAttrNoFollow", uname); return AFP_OK; - case EACCES: - LOG(log_debug, logtype_afpd, "sys_remove_ea(%s/%s): error: %s", uname, attruname, strerror(errno)); - return AFPERR_ACCESS; default: - LOG(log_error, logtype_afpd, "sys_remove_ea(%s/%s): error: %s", uname, attruname, strerror(errno)); + LOG(log_debug, logtype_afpd, "sys_remove_ea(%s/%s): error: %s", uname, attruname, strerror(errno)); return AFPERR_MISC; } } @@ -445,6 +448,9 @@ int sys_ea_copyfile(VFS_FUNC_ARGS_COPYFILE) if (!*name) continue; + if (STRCMP(name, ==, AD_EA_META)) + continue; + if (sfd != -1) { if (fchdir(sfd) == -1) { LOG(log_error, logtype_afpd, "sys_ea_copyfile: cant chdir to sfd: %s",