/* Editor Settings: expandtabs and use 4 spaces for indentation * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: * */ /* * Copyright (c) Likewise Software. All rights Reserved. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the license, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy * of the GNU Lesser General Public License along with this program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Copyright (C) Likewise Software. All rights reserved. * * Module Name: * * lwldap.c * * Abstract: * * Likewise Advanced API (lwadvapi) * * Mac Directory Service Cache Exception API * * Authors: Glenn Curtis (glennc@likewise.com) */ #include "includes.h" #ifdef HAVE_DIRECTORYSERVICE_DIRSERVICES_H #include #include #include #endif #ifdef HAVE_DSOPENDIRSERVICE typedef struct _dsCacheExceptionRqst { AuthorizationExternalForm auth; pid_t pid; } DsCacheExceptionRqst; // Local helper function to do the request DWORD LwDsSendCustomCall(int command, pid_t pid); #endif DWORD LwDsCacheAddPidException( IN pid_t pid ) { #ifdef HAVE_DSOPENDIRSERVICE return LwDsSendCustomCall(10000, pid); #else return LW_ERROR_SUCCESS; #endif } DWORD LwDsCacheRemovePidException( IN pid_t pid ) { #ifdef HAVE_DSOPENDIRSERVICE return LwDsSendCustomCall(10001, pid); #else return LW_ERROR_SUCCESS; #endif } #ifdef HAVE_DSOPENDIRSERVICE DWORD LwDsSendCustomCall( int command, pid_t pid ) { DWORD dwError = LW_ERROR_SUCCESS; tDirReference hDirRef = 0; tDirNodeReference hNodeRef = 0; tDirStatus status = eDSNoErr; const char nodeName[] = "/Cache"; tDataListPtr dirNodeName = NULL; tDataBufferPtr pPidRequest = NULL; tDataBufferPtr pPidResponse = NULL; DsCacheExceptionRqst * pRequest = NULL; status = dsOpenDirService(&hDirRef); if(status != eDSNoErr) { dwError = LW_ERROR_FAILED_STARTUP_PREREQUISITE_CHECK; goto errorexit; } pPidRequest = dsDataBufferAllocate(hDirRef, sizeof(DsCacheExceptionRqst)); if (pPidRequest == NULL) { dwError = LW_ERROR_FAILED_STARTUP_PREREQUISITE_CHECK; goto errorexit; } pPidResponse = dsDataBufferAllocate(hDirRef, sizeof(int32_t)); if (pPidResponse == NULL) { dwError = LW_ERROR_FAILED_STARTUP_PREREQUISITE_CHECK; goto errorexit; } pRequest = (DsCacheExceptionRqst*)pPidRequest->fBufferData; memset(&pRequest->auth, 0, sizeof(pRequest->auth)); pRequest->pid = pid; pPidRequest->fBufferLength = sizeof(DsCacheExceptionRqst); dirNodeName = dsBuildFromPath(hDirRef, nodeName, "/"); if (dirNodeName == NULL) { dwError = LW_ERROR_FAILED_STARTUP_PREREQUISITE_CHECK; goto errorexit; } status = dsOpenDirNode(hDirRef, dirNodeName, &hNodeRef); if (status != eDSNoErr) { // This can happen on older Tiger Mac OS X 10.4 systems, as there is no /Cache plugin. // It is okay to return successful in this scenario. goto errorexit; } status = dsDoPlugInCustomCall(hNodeRef, command, pPidRequest, pPidResponse); if (status != eDSNoErr) { dwError = LW_ERROR_FAILED_STARTUP_PREREQUISITE_CHECK; goto errorexit; } errorexit: if (dirNodeName) dsDataListDeallocate(hDirRef, dirNodeName); if (hNodeRef) dsCloseDirNode(hNodeRef); if (pPidRequest) dsDataBufferDeAllocate(hDirRef, pPidRequest); if (pPidResponse) dsDataBufferDeAllocate(hDirRef, pPidResponse); if (hDirRef) dsCloseDirService(hDirRef); return dwError; } #endif /* local variables: mode: c c-basic-offset: 4 indent-tabs-mode: nil tab-width: 4 end: */