Author: jra Date: 2007-05-24 00:13:24 +0000 (Thu, 24 May 2007) New Revision: 23106
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23106 Log: Use lchown for symlinks. Jeremy. Modified: branches/SAMBA_3_0/source/smbd/trans2.c branches/SAMBA_3_0_26/source/smbd/trans2.c Changeset: Modified: branches/SAMBA_3_0/source/smbd/trans2.c =================================================================== --- branches/SAMBA_3_0/source/smbd/trans2.c 2007-05-23 23:55:12 UTC (rev 23105) +++ branches/SAMBA_3_0/source/smbd/trans2.c 2007-05-24 00:13:24 UTC (rev 23106) @@ -5268,9 +5268,18 @@ */ if ((set_owner != (uid_t)SMB_UID_NO_CHANGE) && (psbuf->st_uid != set_owner)) { - DEBUG(10,("smb_set_file_unix_basic: SMB_SET_FILE_UNIX_BASIC changing owner %u for file %s\n", + int ret; + + DEBUG(10,("smb_set_file_unix_basic: SMB_SET_FILE_UNIX_BASIC changing owner %u for path %s\n", (unsigned int)set_owner, fname )); - if (SMB_VFS_CHOWN(conn, fname, set_owner, (gid_t)-1) != 0) { + + if (S_ISLNK(psbuf->st_mode)) { + ret = SMB_VFS_LCHOWN(conn, fname, set_owner, (gid_t)-1); + } else { + ret = SMB_VFS_CHOWN(conn, fname, set_owner, (gid_t)-1); + } + + if (ret != 0) { status = map_nt_error_from_unix(errno); if (delete_on_fail) { SMB_VFS_UNLINK(conn,fname); Modified: branches/SAMBA_3_0_26/source/smbd/trans2.c =================================================================== --- branches/SAMBA_3_0_26/source/smbd/trans2.c 2007-05-23 23:55:12 UTC (rev 23105) +++ branches/SAMBA_3_0_26/source/smbd/trans2.c 2007-05-24 00:13:24 UTC (rev 23106) @@ -5214,9 +5214,18 @@ */ if ((set_owner != (uid_t)SMB_UID_NO_CHANGE) && (psbuf->st_uid != set_owner)) { - DEBUG(10,("smb_set_file_unix_basic: SMB_SET_FILE_UNIX_BASIC changing owner %u for file %s\n", + int ret; + + DEBUG(10,("smb_set_file_unix_basic: SMB_SET_FILE_UNIX_BASIC changing owner %u for path %s\n", (unsigned int)set_owner, fname )); - if (SMB_VFS_CHOWN(conn, fname, set_owner, (gid_t)-1) != 0) { + + if (S_ISLNK(psbuf->st_mode)) { + ret = SMB_VFS_LCHOWN(conn, fname, set_owner, (gid_t)-1); + } else { + ret = SMB_VFS_CHOWN(conn, fname, set_owner, (gid_t)-1); + } + + if (ret != 0) { status = map_nt_error_from_unix(errno); if (delete_on_fail) { SMB_VFS_UNLINK(conn,fname);