Mail Archives: cygwin-developers/1999/01/03/15:24:19
Funny:
chown works as expected, with the following exception:
My standalone workstation is named `corinna' and my personal
user account is named `corinna', too. The relative SID is 1000.
If I start the command
chown corinna foo
and later
ls -lGn foo
the surprising result is:
-rwxr-xr-x 1 65535 300396 Jan 1 19:38 foo
instead of
-rwxr-xr-x 1 1000 300396 Jan 1 19:38 foo
If I look into this files properties in the explorer,
the owner is `unknown'.
I have found, that the function LookupAccountName()
returns the SID for the account corinna, but with the
SID-type indicator set to SidTypeDomain! The function
has returned the SID for the computer, not for the user.
The tool XCACLS.EXE from NTRESKIT has the same error.
I have patched the function chown in syscalls.cc. I'm not sure,
if this is a reasonable solution, but it works for me and I think
it's a good start for e real solution. I have attached the patch.
It only does the following:
If the returned SidType is not SidTypeUser, It calls LookupAccountName()
again, with username set to `returned_domain_name\\username'.
Regards,
Corinna
ChangeLog:
==========
Sun Jan 3 23:20:00 1998 Corinna Vinschen <corinna DOT vinschen AT cityweb DOT de>
* syscalls.cc (chown): Retry LookupAccountName with username set
to domain\\username, if returned SID-Type is not SidTypeUser.
Index: syscalls.cc
===================================================================
RCS file: /src/cvsroot/winsup-981230/syscalls.cc,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 syscalls.cc
--- syscalls.cc 1998/12/30 23:01:58 1.1.1.1
+++ syscalls.cc 1999/01/03 22:16:21
@@ -794,10 +794,14 @@ chown (const char * name, uid_t uid, gid
BackupRead (hFile, NULL, 0, &bytes_read, TRUE, TRUE, &context);
CloseHandle (hFile);
+ strcpy(abs_buf, username);
+ int retried = 0;
+retry:
+
/* get sid for the new user */
sid_len = 1024;
domname_len = 100;
- if (!LookupAccountName (NULL, username, psid_name,
+ if (!LookupAccountName (NULL, abs_buf, psid_name,
&sid_len, domain_name, &domname_len, &acc_type))
{
__seterrno ();
@@ -811,6 +815,16 @@ chown (const char * name, uid_t uid, gid
return -1;
}
+ if (acc_type != SidTypeUser
+ && ! retried
+ && domain_name && *domain_name)
+ {
+ __small_sprintf (abs_buf, "%s\\%s",
+ domain_name, username);
+ retried = 1;
+ goto retry;
+ }
+
/* convert security descriptor to absolute format */
if (!rel2abssd (psd, abs_psd, 1024))
{
- Raw text -