if (StrCaseCmp(name, "system.nt_sec_desc.group") == 0 || StrCaseCmp(name, "system.nt_sec_desc.group+") == 0) { /* Yup. */ char *namevalue = talloc_asprintf(ctx, "%s:%s", name+19, (const char *) value); if (! ipc_srv) { /* errno set by smbc_server() */ ret = -1; } else if (! namevalue) { errno = ENOMEM; ret = -1; } else { ret = cacl_set(ctx, &srv->cli, &ipc_srv->cli, &pol, path, namevalue, SMBC_XATTR_MODE_CHOWN, 0); } talloc_destroy(ctx); return ret; } I believe SMBC_XATTR_MODE_CHOWN should be SMBC_XATTR_MODE_CHGRP? Also: if (StrCaseCmp(name, "system.nt_sec_desc.*") == 0 || StrCaseCmp(name, "system.nt_sec_desc.*+") == 0 || StrCaseCmp(name, "system.nt_sec_desc.revision") == 0 || StrnCaseCmp(name, "system.nt_sec_desc.acl", 22) == 0 || StrnCaseCmp(name, "system.nt_sec_desc.acl+", 23) == 0) { /* Yup. */ char *namevalue = talloc_asprintf(ctx, "%s:%s", name+19, (const char *) value); if (! ipc_srv) { ret = -1; /* errno set by smbc_server() */ } else if (! namevalue) { errno = ENOMEM; ret = -1; } else { ret = cacl_set(ctx, &srv->cli, &ipc_srv->cli, &pol, path, namevalue, (*namevalue == '*' ? SMBC_XATTR_MODE_SET : SMBC_XATTR_MODE_ADD), flags); } talloc_destroy(ctx); return ret; } Revision redirects to SMBC_XATTR_MODE_ADD, where it never gets changed. Is that supposed to happen, since anything other than a 1 might cause problems? Also, for some reason setxattr using a REPLACE Flag does not work. I get a File Exists Error, (even if I OR the Flag with a CREATE Flag).