#include <stdio.h>
#include <string.h>
#include <DirectoryService/DirectoryService.h>
#include <DirectoryServiceCore/DirectoryServiceCore.h>
#include "dstools_version.h"
#define kMaxArgs 2 // -a | -d | -dump | -flush
#define kMinArgs 2
void SendDSEvent( tPluginCustomCallRequestCode event );
void PrintHelpInfo( void )
{
printf( "Usage: dsperfmonitor -a | -d | -dump | -flush \n\t-a\tactivate API stat gathering\n\t-d\tdeactivate API stat gathering and dump to system.log\n\t-dump\tdump stats to system.log\n\t-flush\treset statistics\n" );
}
int main(int argc, char *argv[])
{
if ( argc > kMaxArgs || argc < kMinArgs )
{
PrintHelpInfo();
return -1;
}
if ( strcmp(argv[1], "-appleversion") == 0 )
dsToolAppleVersionExit( argv[0] );
if ( strcmp(argv[1], "-a") == 0 )
{
SendDSEvent( eDSCustomCallActivatePerfMonitor );
printf( "DirectoryService API statistics are now being gathered\n" );
}
else if ( strcmp(argv[1], "-d") == 0 )
{
SendDSEvent( eDSCustomCallDeactivatePerfMonitor );
printf( "DirectoryService API statistics have been turned off and dumped to /var/log/system.log\n" );
}
else if ( strcmp(argv[1], "-dump") == 0 )
{
SendDSEvent( eDSCustomCallDumpStatsPerfMonitor );
printf( "DirectoryService API statistics have been dumped to /var/log/system.log\n" );
}
else if ( strcmp(argv[1], "-flush") == 0 )
{
SendDSEvent( eDSCustomCallFlushStatsPerfMonitor );
printf( "DirectoryService API statistics reset\n" );
}
else
{
PrintHelpInfo();
return -1;
}
return 0;
}
void SendDSEvent( tPluginCustomCallRequestCode event )
{
tDirNodeReference nodeRef = 0;
tDataList *dataList = NULL;
tDataBuffer *customBuff1 = NULL;
tDataBuffer *emptyBuff = NULL;
tDirReference dsRef = 0;
SInt32 status = eDSNoErr;
status = dsOpenDirService(&dsRef);
do
{
dataList = dsBuildListFromStrings( dsRef, "Configure", NULL );
if (dataList == NULL) break;
status = dsOpenDirNode( dsRef, dataList, &nodeRef );
if (status != eDSNoErr)
{
printf( "dsOpenDirNode returned %d\n", (int32_t) status );
break;
}
emptyBuff = dsDataBufferAllocate( dsRef, 1 );
if (emptyBuff == NULL) break;
customBuff1 = dsDataBufferAllocate( dsRef, 1 );
if (customBuff1 == NULL) break;
do
{
status = dsDoPlugInCustomCall( nodeRef, event, emptyBuff, customBuff1 );
if ( status == eDSBufferTooSmall )
{
UInt32 buffSize = customBuff1->fBufferSize;
dsDataBufferDeAllocate( dsRef, customBuff1 );
customBuff1 = dsDataBufferAllocate( dsRef, buffSize*2 );
}
} while (status == eDSBufferTooSmall);
if (status != eDSNoErr)
{
printf( "dsDoPlugInCustomCall returned %d\n", (int32_t) status );
break;
}
} while ( false );
if (emptyBuff != NULL)
{
dsDataBufferDeAllocate( dsRef, emptyBuff );
emptyBuff = NULL;
}
if (customBuff1 != NULL)
{
dsDataBufferDeAllocate( dsRef, customBuff1 );
customBuff1 = NULL;
}
}