#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <DirectoryService/DirServicesTypes.h>
#include "slp.h"
#include "SLPDefines.h"
#include "SLPComm.h"
OSStatus DoSLPRegistration( char* scopeList, UInt32 scopeListLen, char* url, UInt32 urlLen, char* attributeList, UInt32 attributeListLen );
OSStatus DoSLPDeregistration( char* scopeList, UInt32 scopeListLen, char* url, UInt32 urlLen );
void PrintHelpInfo( void );
#define kMaxURLLen 1024
#define kMaxAttributeLen 1024
#define kMaxArgs 7 // [-r url] [-d url] [-a attribute_list]
int main(int argc, char *argv[])
{
char* scope = "";
UInt32 scopeLen = strlen(scope);
char url[kMaxURLLen] = {0};
UInt32 urlLen = 0;
char attributeList[kMaxAttributeLen] = {0};
UInt32 attributeListLen = 0;
Boolean regFlagSet = false, deregFlagSet = false, listFlagSet = false, attributeFlagSet = false;
OSStatus status = 0;
if ( argc > kMaxArgs || argc == 0 )
{
PrintHelpInfo();
return -1;
}
for ( int i=1; i<argc; i++ ) {
if ( ( strcmp(argv[i], "-r") == 0 || strcmp(argv[i], "-d") == 0 ) && !regFlagSet && !deregFlagSet )
{
i++; urlLen = strlen(argv[i]);
if ( urlLen >= kMaxURLLen )
{
PrintHelpInfo();
return -1;
}
else
strcpy( url, argv[i] );
if ( strcmp(argv[i-1], "-r") == 0 )
regFlagSet = true;
else
deregFlagSet = true;
}
else if ( i >=2 && strcmp(argv[i], "-a") == 0 && !attributeFlagSet )
{
if ( !regFlagSet && !deregFlagSet )
{
PrintHelpInfo();
return -1;
}
i++;
attributeListLen = strlen(argv[i]);
if ( attributeListLen >= kMaxAttributeLen )
{
PrintHelpInfo();
return -1;
}
else
{
strcpy( attributeList, argv[i] );
}
attributeFlagSet = true;
}
else if ( strcmp(argv[i], "-l") == 0 )
{
listFlagSet = true;
}
else
{
PrintHelpInfo();
return -1;
}
}
if ( regFlagSet )
status = DoSLPRegistration( scope, scopeLen, url, urlLen, attributeList, attributeListLen );
else if ( deregFlagSet )
status = DoSLPDeregistration( scope, scopeLen, url, urlLen );
if ( listFlagSet )
{
fprintf( stderr, "we'll need to print out currently registered services here" );
}
return status;
}
OSStatus DoSLPRegistration( char* scopeList, UInt32 scopeListLen, char* url, UInt32 urlLen, char* attributeList, UInt32 attributeListLen )
{
char* dataBuffer = NULL;
char* returnBuffer = NULL;
UInt32 dataBufferLen = 0;
UInt32 returnBufferLen = 0;
OSStatus status = noErr;
dataBuffer = MakeSLPRegistrationDataBuffer ( scopeList, scopeListLen, url, urlLen, attributeList, attributeListLen, &dataBufferLen );
if ( dataBuffer )
{
status = SendDataToSLPd( dataBuffer, dataBufferLen, &returnBuffer, &returnBufferLen );
}
else
status = eMemoryAllocError;
if ( !status && returnBuffer && returnBufferLen > 0 )
status = ((SLPdMessageHeader*)returnBuffer)->messageStatus;
return status;
}
OSStatus DoSLPDeregistration( char* scopeList, UInt32 scopeListLen, char* url, UInt32 urlLen )
{
char* dataBuffer = NULL;
char* returnBuffer = NULL;
UInt32 dataBufferLen = 0;
UInt32 returnBufferLen = 0;
OSStatus status = noErr;
dataBuffer = MakeSLPDeregistrationDataBuffer ( scopeList, scopeListLen, url, urlLen, &dataBufferLen );
if ( dataBuffer )
{
status = SendDataToSLPd( dataBuffer, dataBufferLen, &returnBuffer, &returnBufferLen );
}
else
status = eMemoryAllocError;
if ( !status && returnBuffer && returnBufferLen > 0 )
status = ((SLPdMessageHeader*)returnBuffer)->messageStatus;
return status;
}
void PrintHelpInfo( void )
{
fprintf( stderr,
"Usage: slp_reg [-r|d <url>] [-a <attribute-list>]\n"
" where each of the following is optional:\n"
" -r <url> is a url the user wishes to register\n"
" -d <url> is a url the user wishes to deregister\n"
" -a <attribute-list> is a slp attribute list e.g. \"(a=1,2),boo,(c=false)\"\n" );
}