diff options
Diffstat (limited to 'win/tclWinTest.c')
| -rw-r--r-- | win/tclWinTest.c | 239 | 
1 files changed, 31 insertions, 208 deletions
| diff --git a/win/tclWinTest.c b/win/tclWinTest.c index a3ea423..6027e32 100644 --- a/win/tclWinTest.c +++ b/win/tclWinTest.c @@ -7,16 +7,17 @@   *   * See the file "license.terms" for information on usage and redistribution of   * this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclWinTest.c,v 1.22.2.2 2010/01/31 23:51:37 nijtmans Exp $   */ +#ifndef USE_TCL_STUBS +#   define USE_TCL_STUBS +#endif  #include "tclInt.h"  /*   * For TestplatformChmod on Windows   */ -#ifdef __WIN32__ +#ifdef _WIN32  #include <aclapi.h>  #endif @@ -31,7 +32,6 @@   * Forward declarations of functions defined later in this file:   */ -int			TclplatformtestInit(Tcl_Interp *interp);  static int		TesteventloopCmd(ClientData dummy, Tcl_Interp *interp,  			    int argc, const char **argv);  static int		TestvolumetypeCmd(ClientData dummy, @@ -42,8 +42,6 @@ static int		TestwinclockCmd(ClientData dummy, Tcl_Interp* interp,  static int		TestwinsleepCmd(ClientData dummy, Tcl_Interp* interp,  			    int objc, Tcl_Obj *const objv[]);  static Tcl_ObjCmdProc	TestExceptionCmd; -static int		TestwincpuidCmd(ClientData dummy, Tcl_Interp* interp, -			    int objc, Tcl_Obj *const objv[]);  static int		TestplatformChmod(const char *nativePath, int pmode);  static int		TestchmodCmd(ClientData dummy,  			    Tcl_Interp *interp, int argc, const char **argv); @@ -78,7 +76,6 @@ TclplatformtestInit(      Tcl_CreateObjCommand(interp, "testvolumetype", TestvolumetypeCmd,  	    NULL, NULL);      Tcl_CreateObjCommand(interp, "testwinclock", TestwinclockCmd, NULL, NULL); -    Tcl_CreateObjCommand(interp, "testwincpuid", TestwincpuidCmd, NULL, NULL);      Tcl_CreateObjCommand(interp, "testwinsleep", TestwinsleepCmd, NULL, NULL);      Tcl_CreateObjCommand(interp, "testexcept", TestExceptionCmd, NULL, NULL);      return TCL_OK; @@ -189,7 +186,7 @@ TestvolumetypeCmd(  #define VOL_BUF_SIZE 32      int found;      char volType[VOL_BUF_SIZE]; -    char *path; +    const char *path;      if (objc > 2) {  	Tcl_WrongNumArgs(interp, 1, objv, "?name?"); @@ -214,7 +211,7 @@ TestvolumetypeCmd(  	TclWinConvertError(GetLastError());  	return TCL_ERROR;      } -    Tcl_SetResult(interp, volType, TCL_VOLATILE); +    Tcl_AppendResult(interp, volType, NULL);      return TCL_OK;  #undef VOL_BUF_SIZE  } @@ -294,83 +291,6 @@ TestwinclockCmd(      return TCL_OK;  } -/* - *---------------------------------------------------------------------- - * - * TestwincpuidCmd -- - * - *	Retrieves CPU ID information. - * - * Usage: - *	testwincpuid <eax> - * - * Parameters: - *	eax - The value to pass in the EAX register to a CPUID instruction. - * - * Results: - *	Returns a four-element list containing the values from the EAX, EBX, - *	ECX and EDX registers returned from the CPUID instruction. - * - * Side effects: - *	None. - * - *---------------------------------------------------------------------- - */ - -static int -TestwincpuidCmd( -    ClientData dummy, -    Tcl_Interp* interp,		/* Tcl interpreter */ -    int objc,			/* Parameter count */ -    Tcl_Obj *const * objv)	/* Parameter vector */ -{ -    int status, index, i; -    unsigned int regs[4]; -    Tcl_Obj *regsObjs[4]; - -    if (objc != 2) { -	Tcl_WrongNumArgs(interp, 1, objv, "eax"); -	return TCL_ERROR; -    } -    if (Tcl_GetIntFromObj(interp, objv[1], &index) != TCL_OK) { -	return TCL_ERROR; -    } -    status = TclWinCPUID((unsigned) index, regs); -    if (status != TCL_OK) { -	Tcl_SetObjResult(interp, -		Tcl_NewStringObj("operation not available", -1)); -	return status; -    } -    for (i=0 ; i<4 ; ++i) { -	regsObjs[i] = Tcl_NewIntObj((int) regs[i]); -    } -    Tcl_SetObjResult(interp, Tcl_NewListObj(4, regsObjs)); -    return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * TestwinsleepCmd -- - * - *	Causes this process to wait for the given number of milliseconds by - *	means of a direct call to Sleep. - * - * Usage: - *	testwinsleep <n> - * - * Parameters: - *	n - the number of milliseconds to sleep - * - * Results: - *	None. - * - * Side effects: - *	Sleeps for the requisite number of milliseconds. - * - *---------------------------------------------------------------------- - */ -  static int  TestwinsleepCmd(      ClientData clientData,	/* Unused */ @@ -421,7 +341,7 @@ TestExceptionCmd(      int objc,				/* Argument count */      Tcl_Obj *const objv[])		/* Argument vector */  { -    static const char *cmds[] = { +    static const char *const cmds[] = {  	"access_violation", "datatype_misalignment", "array_bounds",  	"float_denormal", "float_divbyzero", "float_inexact",  	"float_invalidop", "float_overflow", "float_stack", "float_underflow", @@ -430,7 +350,7 @@ TestExceptionCmd(  	"invalid_disp", "guard_page", "invalid_handle", "ctrl+c",  	NULL      }; -    static DWORD exceptions[] = { +    static const DWORD exceptions[] = {  	EXCEPTION_ACCESS_VIOLATION, EXCEPTION_DATATYPE_MISALIGNMENT,  	EXCEPTION_ARRAY_BOUNDS_EXCEEDED, EXCEPTION_FLT_DENORMAL_OPERAND,  	EXCEPTION_FLT_DIVIDE_BY_ZERO, EXCEPTION_FLT_INEXACT_RESULT, @@ -478,28 +398,6 @@ TestplatformChmod(      const char *nativePath,      int pmode)  { -    typedef DWORD (WINAPI *getSidLengthRequiredDef)(UCHAR); -    typedef BOOL (WINAPI *initializeSidDef)(PSID, PSID_IDENTIFIER_AUTHORITY, -	    BYTE); -    typedef PDWORD (WINAPI *getSidSubAuthorityDef)(PSID, DWORD); -    typedef DWORD (WINAPI *setNamedSecurityInfoADef)(IN LPSTR, -	    IN SE_OBJECT_TYPE, IN SECURITY_INFORMATION, IN PSID, IN PSID, -	    IN PACL, IN PACL); -    typedef BOOL (WINAPI *getAceDef)(PACL, DWORD, LPVOID *); -    typedef BOOL (WINAPI *addAceDef)(PACL, DWORD, DWORD, LPVOID, DWORD); -    typedef BOOL (WINAPI *equalSidDef)(PSID, PSID); -    typedef BOOL (WINAPI *addAccessDeniedAceDef)(PACL, DWORD, DWORD, PSID); -    typedef BOOL (WINAPI *initializeAclDef)(PACL, DWORD, DWORD); -    typedef DWORD (WINAPI *getLengthSidDef)(PSID); -    typedef BOOL (WINAPI *getAclInformationDef)(PACL, LPVOID, DWORD, -	    ACL_INFORMATION_CLASS); -    typedef BOOL (WINAPI *getSecurityDescriptorDaclDef)(PSECURITY_DESCRIPTOR, -	    LPBOOL, PACL *, LPBOOL); -    typedef BOOL (WINAPI *lookupAccountNameADef)(LPCSTR, LPCSTR, PSID, -	    PDWORD, LPSTR, LPDWORD, PSID_NAME_USE); -    typedef BOOL (WINAPI *getFileSecurityADef)(LPCSTR, SECURITY_INFORMATION, -	    PSECURITY_DESCRIPTOR, DWORD, LPDWORD); -      static const SECURITY_INFORMATION infoBits = OWNER_SECURITY_INFORMATION  	    | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;      static const DWORD readOnlyMask = FILE_DELETE_CHILD | FILE_ADD_FILE @@ -510,22 +408,6 @@ TestplatformChmod(       * References to security functions (only available on NT and later).       */ -    static getSidLengthRequiredDef getSidLengthRequiredProc; -    static initializeSidDef initializeSidProc; -    static getSidSubAuthorityDef getSidSubAuthorityProc; -    static setNamedSecurityInfoADef setNamedSecurityInfoProc; -    static getAceDef getAceProc; -    static addAceDef addAceProc; -    static equalSidDef equalSidProc; -    static addAccessDeniedAceDef addAccessDeniedAceProc; -    static initializeAclDef initializeAclProc; -    static getLengthSidDef getLengthSidProc; -    static getAclInformationDef getAclInformationProc; -    static getSecurityDescriptorDaclDef getSecurityDescriptorDaclProc; -    static lookupAccountNameADef lookupAccountNameProc; -    static getFileSecurityADef getFileSecurityProc; -    static int initialized = 0; -      const BOOL set_readOnly = !(pmode & 0222);      BOOL acl_readOnly_found = FALSE, curAclPresent, curAclDefaulted;      SID_IDENTIFIER_AUTHORITY userSidAuthority = { @@ -537,72 +419,14 @@ TestplatformChmod(      PACL curAcl, newAcl = 0;      WORD j;      SID *userSid = 0; -    TCHAR *userDomain = 0; +    char *userDomain = 0;      int res = 0;      /* -     * One time initialization, dynamically load Windows NT features -     */ - -    if (!initialized) { -	TCL_DECLARE_MUTEX(initializeMutex) -	Tcl_MutexLock(&initializeMutex); -	if (!initialized) { -	    HINSTANCE hInstance = LoadLibrary("Advapi32"); - -	    if (hInstance != NULL) { -		setNamedSecurityInfoProc = (setNamedSecurityInfoADef) -			GetProcAddress(hInstance, "SetNamedSecurityInfoA"); -		getFileSecurityProc = (getFileSecurityADef) -			GetProcAddress(hInstance, "GetFileSecurityA"); -		getAceProc = (getAceDef) -			GetProcAddress(hInstance, "GetAce"); -		addAceProc = (addAceDef) -			GetProcAddress(hInstance, "AddAce"); -		equalSidProc = (equalSidDef) -			GetProcAddress(hInstance, "EqualSid"); -		addAccessDeniedAceProc = (addAccessDeniedAceDef) -			GetProcAddress(hInstance, "AddAccessDeniedAce"); -		initializeAclProc = (initializeAclDef) -			GetProcAddress(hInstance, "InitializeAcl"); -		getLengthSidProc = (getLengthSidDef) -			GetProcAddress(hInstance, "GetLengthSid"); -		getAclInformationProc = (getAclInformationDef) -			GetProcAddress(hInstance, "GetAclInformation"); -		getSecurityDescriptorDaclProc = (getSecurityDescriptorDaclDef) -			GetProcAddress(hInstance, "GetSecurityDescriptorDacl"); -		lookupAccountNameProc = (lookupAccountNameADef) -			GetProcAddress(hInstance, "LookupAccountNameA"); -		getSidLengthRequiredProc = (getSidLengthRequiredDef) -			GetProcAddress(hInstance, "GetSidLengthRequired"); -		initializeSidProc = (initializeSidDef) -			GetProcAddress(hInstance, "InitializeSid"); -		getSidSubAuthorityProc = (getSidSubAuthorityDef) -			GetProcAddress(hInstance, "GetSidSubAuthority"); - -		if (setNamedSecurityInfoProc && getAceProc && addAceProc -			&& equalSidProc && addAccessDeniedAceProc -			&& initializeAclProc && getLengthSidProc -			&& getAclInformationProc -			&& getSecurityDescriptorDaclProc -			&& lookupAccountNameProc && getFileSecurityProc -			&& getSidLengthRequiredProc && initializeSidProc -			&& getSidSubAuthorityProc) { -		    initialized = 1; -		} -	    } -	    if (!initialized) { -		initialized = -1; -	    } -	} -	Tcl_MutexUnlock(&initializeMutex); -    } - -    /*       * Process the chmod request.       */ -    attr = GetFileAttributes(nativePath); +    attr = GetFileAttributesA(nativePath);      /*       * nativePath not found @@ -614,11 +438,10 @@ TestplatformChmod(      }      /* -     * If no ACL API is present or nativePath is not a directory, there is no -     * special handling. +     * If nativePath is not a directory, there is no special handling.       */ -    if (initialized < 0 || !(attr & FILE_ATTRIBUTE_DIRECTORY)) { +    if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) {  	goto done;      } @@ -634,15 +457,15 @@ TestplatformChmod(       * obtains the size of the security descriptor.       */ -    if (!getFileSecurityProc(nativePath, infoBits, NULL, 0, &secDescLen)) { +    if (!GetFileSecurityA(nativePath, infoBits, NULL, 0, &secDescLen)) {  	DWORD secDescLen2 = 0;  	if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {  	    goto done;  	} -	secDesc = (BYTE *) ckalloc(secDescLen); -	if (!getFileSecurityProc(nativePath, infoBits, +	secDesc = ckalloc(secDescLen); +	if (!GetFileSecurityA(nativePath, infoBits,  		(PSECURITY_DESCRIPTOR) secDesc, secDescLen, &secDescLen2)  		|| (secDescLen < secDescLen2)) {  	    goto done; @@ -653,22 +476,22 @@ TestplatformChmod(       * Get the World SID.       */ -    userSid = (SID *) ckalloc(getSidLengthRequiredProc((UCHAR) 1)); -    initializeSidProc(userSid, &userSidAuthority, (BYTE) 1); -    *(getSidSubAuthorityProc(userSid, 0)) = SECURITY_WORLD_RID; +    userSid = ckalloc(GetSidLengthRequired((UCHAR) 1)); +    InitializeSid(userSid, &userSidAuthority, (BYTE) 1); +    *(GetSidSubAuthority(userSid, 0)) = SECURITY_WORLD_RID;      /*       * If curAclPresent == false then curAcl and curAclDefaulted not valid.       */ -    if (!getSecurityDescriptorDaclProc((PSECURITY_DESCRIPTOR) secDesc, +    if (!GetSecurityDescriptorDacl((PSECURITY_DESCRIPTOR) secDesc,  	    &curAclPresent, &curAcl, &curAclDefaulted)) {  	goto done;      }      if (!curAclPresent || !curAcl) {  	ACLSize.AclBytesInUse = 0;  	ACLSize.AceCount = 0; -    } else if (!getAclInformationProc(curAcl, &ACLSize, sizeof(ACLSize), +    } else if (!GetAclInformation(curAcl, &ACLSize, sizeof(ACLSize),  	    AclSizeInformation)) {  	goto done;      } @@ -678,14 +501,14 @@ TestplatformChmod(       */      newAclSize = ACLSize.AclBytesInUse + sizeof(ACCESS_DENIED_ACE) -	    + getLengthSidProc(userSid) - sizeof(DWORD); -    newAcl = (ACL *) ckalloc(newAclSize); +	    + GetLengthSid(userSid) - sizeof(DWORD); +    newAcl = ckalloc(newAclSize);      /*       * Initialize the new ACL.       */ -    if (!initializeAclProc(newAcl, newAclSize, ACL_REVISION)) { +    if (!InitializeAcl(newAcl, newAclSize, ACL_REVISION)) {  	goto done;      } @@ -693,7 +516,7 @@ TestplatformChmod(       * Add denied to make readonly, this will be known as a "read-only tag".       */ -    if (set_readOnly && !addAccessDeniedAceProc(newAcl, ACL_REVISION, +    if (set_readOnly && !AddAccessDeniedAce(newAcl, ACL_REVISION,  	    readOnlyMask, userSid)) {  	goto done;      } @@ -703,7 +526,7 @@ TestplatformChmod(  	LPVOID pACE2;  	ACE_HEADER *phACE2; -	if (!getAceProc(curAcl, j, &pACE2)) { +	if (!GetAce(curAcl, j, &pACE2)) {  	    goto done;  	} @@ -726,7 +549,7 @@ TestplatformChmod(  	    ACCESS_DENIED_ACE *pACEd = (ACCESS_DENIED_ACE *) phACE2;  	    if (pACEd->Mask == readOnlyMask -		    && equalSidProc(userSid, (PSID) &pACEd->SidStart)) { +		    && EqualSid(userSid, (PSID) &pACEd->SidStart)) {  		acl_readOnly_found = TRUE;  		continue;  	    } @@ -736,7 +559,7 @@ TestplatformChmod(  	 * Copy the current ACE from the old to the new ACL.  	 */ -	if (!addAceProc(newAcl, ACL_REVISION, MAXDWORD, (PACL *)pACE2, +	if (!AddAce(newAcl, ACL_REVISION, MAXDWORD, (PACL *) pACE2,  		((PACE_HEADER) pACE2)->AceSize)) {  	    goto done;  	} @@ -746,7 +569,7 @@ TestplatformChmod(       * Apply the new ACL.       */ -    if (set_readOnly == acl_readOnly_found || setNamedSecurityInfoProc( +    if (set_readOnly == acl_readOnly_found || SetNamedSecurityInfoA(  	    (LPSTR) nativePath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,  	    NULL, NULL, newAcl, NULL) == ERROR_SUCCESS) {  	res = 0; @@ -754,13 +577,13 @@ TestplatformChmod(    done:      if (secDesc) { -	ckfree((char *) secDesc); +	ckfree(secDesc);      }      if (newAcl) { -	ckfree((char *) newAcl); +	ckfree(newAcl);      }      if (userSid) { -	ckfree((char *) userSid); +	ckfree(userSid);      }      if (userDomain) {  	ckfree(userDomain); | 
