1036 lines
27 KiB
C
1036 lines
27 KiB
C
/********************************************************************/
|
||
/** Copyright(c) 1989 Microsoft Corporation. **/
|
||
/********************************************************************/
|
||
|
||
//***
|
||
//
|
||
// Filename: cmd.c
|
||
//
|
||
// Description:
|
||
//
|
||
// History:
|
||
// Oct 1,1993. NarenG Created original version.
|
||
//
|
||
|
||
#include <client.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "cmd.h"
|
||
|
||
CHAR * pszTRUE = "TRUE";
|
||
CHAR * pszFALSE = "FALSE";
|
||
CHAR * pszUnlimited = "UNLIMITED";
|
||
|
||
|
||
VOID
|
||
PrintMessageAndExit(
|
||
DWORD ids,
|
||
CHAR * pchInsertString
|
||
)
|
||
{
|
||
CHAR Error[10];
|
||
CHAR MsgBuf[1000];
|
||
DWORD cbMessage;
|
||
LPSTR pszMessage;
|
||
|
||
switch( ids )
|
||
{
|
||
case IDS_GENERAL_SYNTAX:
|
||
case IDS_VOLUME_SYNTAX:
|
||
case IDS_DIRECTORY_SYNTAX:
|
||
case IDS_SERVER_SYNTAX:
|
||
case IDS_FORKIZE_SYNTAX:
|
||
case IDS_VOLUME_TOO_BIG:
|
||
case IDS_SUCCESS:
|
||
|
||
cbMessage = FormatMessageA(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||
FORMAT_MESSAGE_FROM_HMODULE,
|
||
NULL,
|
||
(DWORD)ids,
|
||
LANG_NEUTRAL,
|
||
(LPSTR)&pszMessage,
|
||
128,
|
||
NULL );
|
||
|
||
|
||
break;
|
||
|
||
case IDS_AMBIGIOUS_SWITCH_ERROR:
|
||
case IDS_UNKNOWN_SWITCH_ERROR:
|
||
case IDS_DUPLICATE_SWITCH_ERROR:
|
||
|
||
cbMessage = FormatMessageA(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||
FORMAT_MESSAGE_FROM_HMODULE |
|
||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||
NULL,
|
||
(DWORD)ids,
|
||
LANG_NEUTRAL,
|
||
(LPSTR)&pszMessage,
|
||
128,
|
||
NULL );
|
||
|
||
if ( cbMessage > 0 )
|
||
{
|
||
sprintf( MsgBuf, pszMessage, pchInsertString );
|
||
|
||
CharToOem( MsgBuf, MsgBuf );
|
||
|
||
LocalFree( pszMessage );
|
||
|
||
fprintf( stdout, MsgBuf );
|
||
|
||
fprintf( stdout, "\n" );
|
||
}
|
||
|
||
exit( 0 );
|
||
|
||
break;
|
||
|
||
case IDS_API_ERROR:
|
||
|
||
_itoa( (int)((ULONG_PTR)pchInsertString), Error, 10 );
|
||
|
||
cbMessage = FormatMessageA(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||
FORMAT_MESSAGE_FROM_HMODULE |
|
||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||
NULL,
|
||
(DWORD)ids,
|
||
LANG_NEUTRAL,
|
||
(LPSTR)&pszMessage,
|
||
128,
|
||
NULL );
|
||
|
||
if ( cbMessage > 0 )
|
||
{
|
||
sprintf( MsgBuf, pszMessage, Error );
|
||
|
||
CharToOem( MsgBuf, MsgBuf );
|
||
|
||
fprintf( stdout, MsgBuf );
|
||
|
||
fprintf( stdout, "\n" );
|
||
|
||
LocalFree( pszMessage );
|
||
}
|
||
|
||
if ( ((LONG)((LONG_PTR)pchInsertString)) > 0 )
|
||
{
|
||
cbMessage = FormatMessageA(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||
FORMAT_MESSAGE_FROM_SYSTEM,
|
||
NULL,
|
||
(LONG)((LONG_PTR)pchInsertString),
|
||
LANG_NEUTRAL,
|
||
(LPSTR)&pszMessage,
|
||
128,
|
||
NULL );
|
||
}
|
||
|
||
if ( ((LONG)((LONG_PTR)pchInsertString)) < 0 )
|
||
{
|
||
cbMessage = FormatMessageA(
|
||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||
FORMAT_MESSAGE_FROM_HMODULE,
|
||
NULL,
|
||
AFPERR_TO_STRINGID( (LONG)((LONG_PTR)pchInsertString) ),
|
||
LANG_NEUTRAL,
|
||
(LPSTR)&pszMessage,
|
||
128,
|
||
NULL );
|
||
|
||
}
|
||
|
||
break;
|
||
|
||
default:
|
||
exit( 0 );
|
||
}
|
||
|
||
if ( cbMessage > 0 )
|
||
{
|
||
CharToOem( pszMessage, pszMessage );
|
||
|
||
fprintf( stdout, pszMessage );
|
||
|
||
fprintf( stdout, "\n" );
|
||
|
||
LocalFree( pszMessage );
|
||
}
|
||
|
||
exit(0);
|
||
}
|
||
|
||
VOID
|
||
DoVolumeAdd(
|
||
CHAR * pchServer,
|
||
CHAR * pchName,
|
||
CHAR * pchPath,
|
||
CHAR * pchPassword,
|
||
CHAR * pchReadOnly,
|
||
CHAR * pchGuestsAllowed,
|
||
CHAR * pchMaxUses
|
||
)
|
||
{
|
||
PAFP_DIRECTORY_INFO pAfpDirInfo;
|
||
AFP_VOLUME_INFO AfpVolInfo;
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchName[AFP_VOLNAME_LEN+1];
|
||
WCHAR wchPassword[AFP_VOLPASS_LEN+1];
|
||
WCHAR wchServer[CNLEN+3];
|
||
LPWSTR lpwsPath;
|
||
LPSTR lpDrivePath;
|
||
DWORD dwParmNum = AFP_DIR_PARMNUM_PERMS;
|
||
|
||
ZeroMemory( &AfpVolInfo, sizeof( AfpVolInfo ) );
|
||
|
||
//
|
||
// Check to see if the mandatory values are not supplied
|
||
//
|
||
|
||
if ( ( pchName == NULL ) || ( pchPath == NULL ) || ( *pchName == (CHAR)NULL)
|
||
|| ( *pchPath == (CHAR)NULL ) )
|
||
PrintMessageAndExit( IDS_VOLUME_SYNTAX, NULL );
|
||
|
||
mbstowcs(wchName, pchName, sizeof(wchName));
|
||
|
||
AfpVolInfo.afpvol_name = wchName;
|
||
|
||
lpwsPath = LocalAlloc(LPTR, (strlen(pchPath) + 1) * sizeof(WCHAR));
|
||
|
||
if (lpwsPath == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
lpDrivePath = LocalAlloc(LPTR, (CNLEN + 6 + 1));
|
||
if (lpDrivePath == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
mbstowcs(lpwsPath, pchPath, (strlen(pchPath)+1)*sizeof(WCHAR));
|
||
|
||
AfpVolInfo.afpvol_path = lpwsPath;
|
||
|
||
if ( pchServer )
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
if ( (pchPassword) && ( strlen( pchPassword ) > 0 ) )
|
||
{
|
||
mbstowcs(wchPassword, pchPassword, sizeof(wchPassword));
|
||
|
||
AfpVolInfo.afpvol_password = wchPassword;
|
||
}
|
||
else
|
||
AfpVolInfo.afpvol_password = NULL;
|
||
|
||
if ( pchMaxUses )
|
||
{
|
||
if ( *pchMaxUses )
|
||
{
|
||
if (_strnicmp(pchMaxUses, pszUnlimited, strlen(pchMaxUses)) == 0)
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else if ( strspn(pchMaxUses, "1234567890") != strlen(pchMaxUses) )
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
else if ( strlen( pchMaxUses ) > strlen( "4294967295" ) )
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else if ( ( strlen( pchMaxUses ) == strlen( "4294967295" ) ) &&
|
||
( _stricmp( pchMaxUses, "4294967295" ) > 0 ) )
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else
|
||
AfpVolInfo.afpvol_max_uses = atoi(pchMaxUses);
|
||
|
||
if ( AfpVolInfo.afpvol_max_uses == 0 )
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
|
||
AfpVolInfo.afpvol_props_mask = 0;
|
||
|
||
if (pchReadOnly != NULL)
|
||
{
|
||
if ( *pchReadOnly )
|
||
{
|
||
if (_strnicmp(pchReadOnly, pszTRUE, strlen(pchReadOnly) ) == 0)
|
||
AfpVolInfo.afpvol_props_mask |= AFP_VOLUME_READONLY;
|
||
else if (_strnicmp(pchReadOnly, pszFALSE, strlen(pchReadOnly))!=0)
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchGuestsAllowed != NULL)
|
||
{
|
||
if ( *pchGuestsAllowed )
|
||
{
|
||
if (_strnicmp(pchGuestsAllowed,pszTRUE,strlen(pchGuestsAllowed))==0)
|
||
AfpVolInfo.afpvol_props_mask |= AFP_VOLUME_GUESTACCESS;
|
||
else if(_strnicmp(pchGuestsAllowed,
|
||
pszFALSE,strlen(pchGuestsAllowed))!=0)
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
AfpVolInfo.afpvol_props_mask |= AFP_VOLUME_GUESTACCESS;
|
||
|
||
|
||
//
|
||
// Connect with the server
|
||
//
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
//
|
||
// First get and set directory information.
|
||
//
|
||
|
||
|
||
dwRetCode = AfpAdminDirectoryGetInfo(hServer,
|
||
lpwsPath,
|
||
(LPBYTE*)&pAfpDirInfo);
|
||
|
||
if (dwRetCode == NO_ERROR)
|
||
{
|
||
pAfpDirInfo->afpdir_path = lpwsPath;
|
||
|
||
if ( pAfpDirInfo->afpdir_owner != (LPWSTR)NULL )
|
||
{
|
||
dwParmNum |= AFP_DIR_PARMNUM_OWNER;
|
||
}
|
||
|
||
if ( pAfpDirInfo->afpdir_group != (LPWSTR)NULL )
|
||
{
|
||
dwParmNum |= AFP_DIR_PARMNUM_GROUP;
|
||
}
|
||
|
||
dwRetCode = AfpAdminVolumeAdd(hServer, (LPBYTE)&AfpVolInfo);
|
||
|
||
// Directory permissions need not be changed here
|
||
|
||
#if 0
|
||
if (dwRetCode == NO_ERROR)
|
||
{
|
||
dwRetCode = AfpAdminDirectorySetInfo(hServer,
|
||
(LPBYTE)pAfpDirInfo,
|
||
dwParmNum);
|
||
}
|
||
#endif
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
{
|
||
printf ("AfpAdminVolumeAdd failed with error %ld\n",
|
||
dwRetCode);
|
||
}
|
||
|
||
AfpAdminBufferFree(pAfpDirInfo);
|
||
}
|
||
|
||
// we will get this if it's a CDROM. UI ignores this error: why not macfile?
|
||
else if (dwRetCode == AFPERR_SecurityNotSupported)
|
||
{
|
||
dwRetCode = AfpAdminVolumeAdd(hServer, (LPBYTE)&AfpVolInfo);
|
||
}
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect(hServer);
|
||
|
||
LocalFree(lpwsPath);
|
||
|
||
if (pchServer)
|
||
{
|
||
DWORD dwLen;
|
||
|
||
// using the server name, form a path like \\foobar\d$\
|
||
// (the +2 for the leading \\)
|
||
for (dwLen=0; dwLen < CNLEN+2; dwLen++ )
|
||
{
|
||
lpDrivePath[dwLen] = pchServer[dwLen];
|
||
if (pchServer[dwLen] == 0)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
lpDrivePath[CNLEN] = 0; // just to be sure
|
||
strcat(lpDrivePath,"\\");
|
||
dwLen = strlen(lpDrivePath);
|
||
lpDrivePath[dwLen] = pchPath[0];
|
||
lpDrivePath[dwLen+1] = 0;
|
||
strcat(lpDrivePath,"$\\");
|
||
}
|
||
else
|
||
{
|
||
strncpy(lpDrivePath, pchPath, 3);
|
||
lpDrivePath[2] = '\\';
|
||
lpDrivePath[3] = 0;
|
||
}
|
||
|
||
if (IsDriveGreaterThan2Gig(lpDrivePath))
|
||
{
|
||
LocalFree(lpDrivePath);
|
||
PrintMessageAndExit(IDS_VOLUME_TOO_BIG, NULL);
|
||
}
|
||
|
||
LocalFree(lpDrivePath);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
else
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
|
||
}
|
||
|
||
VOID
|
||
DoVolumeDelete(
|
||
CHAR * pchServer,
|
||
CHAR * pchName
|
||
)
|
||
{
|
||
WCHAR wchName[AFP_VOLNAME_LEN+1];
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchServer[CNLEN+3];
|
||
PAFP_VOLUME_INFO pAfpVolumeInfo;
|
||
PAFP_CONNECTION_INFO pAfpConnections;
|
||
PAFP_CONNECTION_INFO pAfpConnInfoIter;
|
||
DWORD cEntriesRead;
|
||
DWORD cTotalAvail;
|
||
DWORD dwIndex;
|
||
|
||
if ( ( pchName == NULL ) || ( *pchName == (CHAR)NULL ) )
|
||
PrintMessageAndExit( IDS_VOLUME_SYNTAX, NULL );
|
||
|
||
mbstowcs(wchName, pchName, sizeof(wchName));
|
||
|
||
if (pchServer)
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
|
||
dwRetCode = AfpAdminVolumeGetInfo( hServer,
|
||
(LPWSTR)wchName,
|
||
(LPBYTE*)&pAfpVolumeInfo );
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
//
|
||
// Check if there are any users connected to the volume
|
||
// by enumerating the connections to this volume.
|
||
//
|
||
|
||
dwRetCode = AfpAdminConnectionEnum( hServer,
|
||
(LPBYTE*)&pAfpConnections,
|
||
AFP_FILTER_ON_VOLUME_ID,
|
||
pAfpVolumeInfo->afpvol_id,
|
||
(DWORD)-1, // Get all conenctions
|
||
&cEntriesRead,
|
||
&cTotalAvail,
|
||
NULL );
|
||
|
||
AfpAdminBufferFree( pAfpVolumeInfo );
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
for ( dwIndex = 0, pAfpConnInfoIter = pAfpConnections;
|
||
dwIndex < cEntriesRead;
|
||
dwIndex++, pAfpConnInfoIter++ )
|
||
{
|
||
dwRetCode = AfpAdminConnectionClose( hServer,
|
||
pAfpConnInfoIter->afpconn_id );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
PrintMessageAndExit( IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode) );
|
||
}
|
||
|
||
AfpAdminBufferFree( pAfpConnections );
|
||
|
||
dwRetCode = AfpAdminVolumeDelete( hServer, wchName );
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect( hServer );
|
||
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
}
|
||
|
||
VOID
|
||
DoVolumeSet(
|
||
CHAR * pchServer,
|
||
CHAR * pchName,
|
||
CHAR * pchPassword,
|
||
CHAR * pchReadOnly,
|
||
CHAR * pchGuestsAllowed,
|
||
CHAR * pchMaxUses
|
||
)
|
||
{
|
||
DWORD dwParmNum = 0;
|
||
AFP_VOLUME_INFO AfpVolInfo;
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchName[AFP_VOLNAME_LEN+1];
|
||
WCHAR wchPassword[AFP_VOLPASS_LEN+1];
|
||
WCHAR wchServer[CNLEN+3];
|
||
|
||
//
|
||
// Check to see if the mandatory values are not supplied
|
||
//
|
||
|
||
if ( ( pchName == NULL ) || ( *pchName == (CHAR)NULL ) )
|
||
PrintMessageAndExit( IDS_VOLUME_SYNTAX, NULL );
|
||
|
||
mbstowcs(wchName, pchName, sizeof(wchName));
|
||
|
||
AfpVolInfo.afpvol_name = wchName;
|
||
|
||
if (pchServer)
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchPassword)
|
||
{
|
||
dwParmNum |= AFP_VOL_PARMNUM_PASSWORD;
|
||
|
||
if (*pchPassword)
|
||
{
|
||
mbstowcs(wchPassword, pchPassword, sizeof(wchPassword));
|
||
AfpVolInfo.afpvol_password = wchPassword;
|
||
}
|
||
else
|
||
AfpVolInfo.afpvol_password = NULL;
|
||
}
|
||
|
||
if (pchMaxUses)
|
||
{
|
||
if (*pchMaxUses)
|
||
{
|
||
dwParmNum |= AFP_VOL_PARMNUM_MAXUSES;
|
||
|
||
if (_strnicmp(pchMaxUses, pszUnlimited, strlen(pchMaxUses))== 0)
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else if ( strspn(pchMaxUses, "1234567890") != strlen(pchMaxUses) )
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
else if ( strlen( pchMaxUses ) > strlen( "4294967295" ) )
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else if ( ( strlen( pchMaxUses ) == strlen( "4294967295" ) ) &&
|
||
( _stricmp( pchMaxUses, "4294967295" ) > 0 ) )
|
||
AfpVolInfo.afpvol_max_uses = AFP_VOLUME_UNLIMITED_USES;
|
||
else
|
||
AfpVolInfo.afpvol_max_uses = atoi(pchMaxUses);
|
||
|
||
if ( AfpVolInfo.afpvol_max_uses == 0 )
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
AfpVolInfo.afpvol_max_uses = 0;
|
||
|
||
AfpVolInfo.afpvol_props_mask = 0;
|
||
|
||
if (pchReadOnly)
|
||
{
|
||
if (*pchReadOnly)
|
||
{
|
||
dwParmNum |= AFP_VOL_PARMNUM_PROPSMASK;
|
||
|
||
if (_strnicmp(pchReadOnly, pszTRUE, strlen(pchReadOnly) ) == 0)
|
||
AfpVolInfo.afpvol_props_mask |= AFP_VOLUME_READONLY;
|
||
else if (_strnicmp(pchReadOnly, pszFALSE, strlen(pchReadOnly))!=0)
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchGuestsAllowed)
|
||
{
|
||
if (*pchGuestsAllowed)
|
||
{
|
||
dwParmNum |= AFP_VOL_PARMNUM_PROPSMASK;
|
||
|
||
if (_strnicmp(pchGuestsAllowed, pszTRUE,
|
||
strlen(pchGuestsAllowed))==0)
|
||
AfpVolInfo.afpvol_props_mask |= AFP_VOLUME_GUESTACCESS;
|
||
else if (_strnicmp(pchGuestsAllowed,
|
||
pszFALSE,strlen(pchGuestsAllowed)) != 0)
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_VOLUME_SYNTAX, NULL);
|
||
}
|
||
|
||
if (dwParmNum == 0)
|
||
PrintMessageAndExit( IDS_VOLUME_SYNTAX, NULL );
|
||
|
||
//
|
||
// Connect with the server
|
||
//
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
dwRetCode = AfpAdminVolumeSetInfo( hServer,
|
||
(LPBYTE)&AfpVolInfo,
|
||
dwParmNum);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect(hServer);
|
||
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
}
|
||
|
||
VOID
|
||
DoServerSetInfo(
|
||
CHAR * pchServer,
|
||
CHAR * pchMaxSessions,
|
||
CHAR * pchLoginMessage,
|
||
CHAR * pchGuestsAllowed,
|
||
CHAR * pchUAMRequired,
|
||
CHAR * pchAllowSavedPasswords,
|
||
CHAR * pchMacServerName
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchServer[CNLEN+3];
|
||
DWORD dwParmNum = 0;
|
||
AFP_SERVER_INFO AfpServerInfo;
|
||
WCHAR wchLoginMsg[AFP_MESSAGE_LEN+1];
|
||
WCHAR wchMacServerName[AFP_SERVERNAME_LEN+1];
|
||
|
||
if (pchMaxSessions)
|
||
{
|
||
if (*pchMaxSessions)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_MAX_SESSIONS;
|
||
|
||
if (_strnicmp(pchMaxSessions,
|
||
pszUnlimited,
|
||
strlen(pchMaxSessions)) == 0)
|
||
AfpServerInfo.afpsrv_max_sessions = AFP_MAXSESSIONS;
|
||
else if (strspn(pchMaxSessions, "1234567890")
|
||
!= strlen(pchMaxSessions))
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
else
|
||
AfpServerInfo.afpsrv_max_sessions = atoi(pchMaxSessions);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchLoginMessage)
|
||
{
|
||
if (*pchLoginMessage)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_LOGINMSG;
|
||
|
||
if (strlen(pchLoginMessage) > AFP_MESSAGE_LEN)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
else
|
||
{
|
||
mbstowcs(wchLoginMsg, pchLoginMessage, sizeof(wchLoginMsg));
|
||
AfpServerInfo.afpsrv_login_msg = wchLoginMsg;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_LOGINMSG;
|
||
AfpServerInfo.afpsrv_login_msg = NULL;
|
||
}
|
||
}
|
||
|
||
AfpServerInfo.afpsrv_options = 0;
|
||
|
||
#if 0
|
||
if (pchGuestsAllowed)
|
||
{
|
||
if (*pchGuestsAllowed)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_OPTIONS;
|
||
|
||
if (_strnicmp(pchGuestsAllowed,
|
||
pszTRUE,
|
||
strlen(pchGuestsAllowed)) == 0)
|
||
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_GUESTLOGONALLOWED;
|
||
else if (_strnicmp(pchGuestsAllowed,
|
||
pszFALSE,
|
||
strlen(pchGuestsAllowed)) != 0)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
else
|
||
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_GUESTLOGONALLOWED;
|
||
#endif
|
||
|
||
|
||
if (pchUAMRequired)
|
||
{
|
||
if (*pchUAMRequired)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_OPTIONS;
|
||
|
||
if (_strnicmp(pchUAMRequired,
|
||
pszFALSE,
|
||
strlen(pchGuestsAllowed)) == 0)
|
||
AfpServerInfo.afpsrv_options|=AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
|
||
else if (_strnicmp(pchUAMRequired,
|
||
pszTRUE,
|
||
strlen(pchUAMRequired)) != 0)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchAllowSavedPasswords)
|
||
{
|
||
if (*pchAllowSavedPasswords)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_OPTIONS;
|
||
|
||
if (_strnicmp(pchAllowSavedPasswords,
|
||
pszTRUE,
|
||
strlen(pchAllowSavedPasswords)) == 0)
|
||
AfpServerInfo.afpsrv_options|=AFP_SRVROPT_ALLOWSAVEDPASSWORD;
|
||
else if (_strnicmp(pchAllowSavedPasswords,
|
||
pszFALSE,
|
||
strlen(pchAllowSavedPasswords)) != 0)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchMacServerName)
|
||
{
|
||
if (*pchMacServerName)
|
||
{
|
||
dwParmNum |= AFP_SERVER_PARMNUM_NAME;
|
||
|
||
if (strlen(pchMacServerName) > AFP_SERVERNAME_LEN)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
else
|
||
{
|
||
mbstowcs(wchMacServerName,
|
||
pchMacServerName,
|
||
sizeof(wchMacServerName));
|
||
|
||
AfpServerInfo.afpsrv_name = wchMacServerName;
|
||
}
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
|
||
if (dwParmNum == 0)
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
|
||
if (pchServer)
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_SERVER_SYNTAX, NULL);
|
||
}
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
dwRetCode = AfpAdminServerSetInfo( hServer,
|
||
(LPBYTE)&AfpServerInfo,
|
||
dwParmNum);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect(hServer);
|
||
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
}
|
||
|
||
VOID
|
||
DoDirectorySetInfo(
|
||
CHAR * pchServer,
|
||
CHAR * pchPath,
|
||
CHAR * pchOwnerName,
|
||
CHAR * pchGroupName,
|
||
CHAR * pchPermissions
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchServer[CNLEN+3];
|
||
LPWSTR lpwsPath;
|
||
WCHAR wchOwner[UNLEN+1];
|
||
WCHAR wchGroup[GNLEN+1];
|
||
DWORD dwPerms;
|
||
|
||
AFP_DIRECTORY_INFO AfpDirInfo;
|
||
DWORD dwParmNum = 0;
|
||
|
||
if ( ( pchPath == NULL ) || ( *pchPath == (CHAR)NULL ) )
|
||
PrintMessageAndExit( IDS_DIRECTORY_SYNTAX, NULL );
|
||
|
||
lpwsPath = LocalAlloc(LPTR, (strlen(pchPath) + 1) * sizeof(WCHAR));
|
||
|
||
if (lpwsPath == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
mbstowcs(lpwsPath, pchPath, (strlen(pchPath)+1)*sizeof(WCHAR));
|
||
AfpDirInfo.afpdir_path = lpwsPath;
|
||
|
||
if (pchServer)
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchOwnerName)
|
||
{
|
||
if (*pchOwnerName)
|
||
{
|
||
if (strlen(pchOwnerName) > UNLEN)
|
||
PrintMessageAndExit(IDS_GENERAL_SYNTAX, NULL);
|
||
|
||
mbstowcs(wchOwner, pchOwnerName, sizeof(wchOwner));
|
||
AfpDirInfo.afpdir_owner = wchOwner;
|
||
dwParmNum |= AFP_DIR_PARMNUM_OWNER;
|
||
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchGroupName)
|
||
{
|
||
if (*pchGroupName)
|
||
{
|
||
mbstowcs(wchGroup, pchGroupName, sizeof(wchGroup));
|
||
AfpDirInfo.afpdir_group = wchGroup;
|
||
dwParmNum |= AFP_DIR_PARMNUM_GROUP;
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchPermissions)
|
||
{
|
||
if (*pchPermissions)
|
||
{
|
||
if (strspn(pchPermissions, "10") != strlen(pchPermissions))
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
|
||
if (strlen(pchPermissions) != 11)
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
|
||
dwPerms = 0;
|
||
|
||
if (pchPermissions[0] == '1')
|
||
dwPerms |= AFP_PERM_OWNER_SFI;
|
||
if (pchPermissions[1] == '1')
|
||
dwPerms |= AFP_PERM_OWNER_SFO;
|
||
if (pchPermissions[2] == '1')
|
||
dwPerms |= AFP_PERM_OWNER_MC;
|
||
if (pchPermissions[3] == '1')
|
||
dwPerms |= AFP_PERM_GROUP_SFI;
|
||
if (pchPermissions[4] == '1')
|
||
dwPerms |= AFP_PERM_GROUP_SFO;
|
||
if (pchPermissions[5] == '1')
|
||
dwPerms |= AFP_PERM_GROUP_MC;
|
||
if (pchPermissions[6] == '1')
|
||
dwPerms |= AFP_PERM_WORLD_SFI;
|
||
if (pchPermissions[7] == '1')
|
||
dwPerms |= AFP_PERM_WORLD_SFO;
|
||
if (pchPermissions[8] == '1')
|
||
dwPerms |= AFP_PERM_WORLD_MC;
|
||
if (pchPermissions[9] == '1')
|
||
dwPerms |= AFP_PERM_INHIBIT_MOVE_DELETE;
|
||
if (pchPermissions[10] == '1')
|
||
dwPerms |= AFP_PERM_SET_SUBDIRS;
|
||
|
||
AfpDirInfo.afpdir_perms = dwPerms;
|
||
dwParmNum |= AFP_DIR_PARMNUM_PERMS;
|
||
}
|
||
else
|
||
PrintMessageAndExit(IDS_DIRECTORY_SYNTAX, NULL);
|
||
}
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
dwRetCode = AfpAdminDirectorySetInfo(hServer,
|
||
(LPBYTE)&AfpDirInfo,
|
||
dwParmNum);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect(hServer);
|
||
|
||
LocalFree(lpwsPath);
|
||
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
}
|
||
|
||
VOID
|
||
DoForkize(
|
||
CHAR * pchServer,
|
||
CHAR * pchType,
|
||
CHAR * pchCreator,
|
||
CHAR * pchDataFork,
|
||
CHAR * pchResourceFork,
|
||
CHAR * pchTargetFile
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
AFP_SERVER_HANDLE hServer;
|
||
WCHAR wchServer[CNLEN+3];
|
||
LPWSTR lpwsTarget;
|
||
LPWSTR lpwsResource;
|
||
LPWSTR lpwsData;
|
||
WCHAR wchType[AFP_TYPE_LEN+1];
|
||
WCHAR wchCreator[AFP_CREATOR_LEN+1];
|
||
DWORD dwParmNum = 0;
|
||
|
||
if ( ( pchTargetFile == NULL ) || ( *pchTargetFile == (CHAR)NULL ) )
|
||
PrintMessageAndExit( IDS_FORKIZE_SYNTAX, NULL );
|
||
|
||
lpwsTarget = LocalAlloc(LPTR, (strlen(pchTargetFile) + 1) * sizeof(WCHAR));
|
||
|
||
if (lpwsTarget == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
mbstowcs(lpwsTarget,pchTargetFile,(strlen(pchTargetFile)+1)*sizeof(WCHAR));
|
||
|
||
if (pchServer)
|
||
{
|
||
if (*pchServer)
|
||
mbstowcs(wchServer, pchServer, sizeof(wchServer));
|
||
else
|
||
PrintMessageAndExit(IDS_FORKIZE_SYNTAX, NULL);
|
||
}
|
||
|
||
if (pchType != NULL)
|
||
{
|
||
if ( ( *pchType == (CHAR)NULL ) || ( strlen( pchType ) > AFP_TYPE_LEN ))
|
||
PrintMessageAndExit(IDS_API_ERROR,(LPSTR)AFPERR_InvalidTypeCreator);
|
||
else
|
||
mbstowcs(wchType, pchType, sizeof(wchType));
|
||
|
||
dwParmNum |= AFP_FD_PARMNUM_TYPE;
|
||
}
|
||
|
||
if (pchCreator != NULL)
|
||
{
|
||
if ((*pchCreator == (CHAR)NULL) || (strlen(pchCreator)>AFP_CREATOR_LEN))
|
||
PrintMessageAndExit(IDS_API_ERROR,(LPSTR)AFPERR_InvalidTypeCreator);
|
||
else
|
||
mbstowcs(wchCreator, pchCreator, sizeof(wchCreator));
|
||
|
||
dwParmNum |= AFP_FD_PARMNUM_CREATOR;
|
||
}
|
||
|
||
if (pchResourceFork != NULL)
|
||
{
|
||
if ( *pchResourceFork == (CHAR)NULL )
|
||
PrintMessageAndExit( IDS_FORKIZE_SYNTAX, NULL );
|
||
|
||
lpwsResource=LocalAlloc(LPTR,(strlen(pchResourceFork)+1)*sizeof(WCHAR));
|
||
|
||
if (lpwsResource == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
mbstowcs(lpwsResource,pchResourceFork,
|
||
(strlen(pchResourceFork)+1)*sizeof(WCHAR));
|
||
}
|
||
else
|
||
lpwsResource = NULL;
|
||
|
||
if (pchDataFork != NULL)
|
||
{
|
||
if ( *pchDataFork == (CHAR)NULL )
|
||
PrintMessageAndExit( IDS_FORKIZE_SYNTAX, NULL );
|
||
|
||
lpwsData = LocalAlloc(LPTR,(strlen(pchDataFork)+1)*sizeof(WCHAR));
|
||
|
||
if (lpwsData == NULL)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR*)ERROR_NOT_ENOUGH_MEMORY);
|
||
|
||
mbstowcs(lpwsData,pchDataFork,
|
||
(strlen(pchDataFork)+1)*sizeof(WCHAR));
|
||
}
|
||
else
|
||
lpwsData = NULL;
|
||
|
||
if ((pchType == NULL) && (pchCreator == NULL) &&
|
||
(pchResourceFork == NULL) && (pchDataFork == NULL))
|
||
PrintMessageAndExit(IDS_FORKIZE_SYNTAX, NULL);
|
||
|
||
dwRetCode = AfpAdminConnect(pchServer ? wchServer : NULL, &hServer);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
dwRetCode = AfpAdminFinderSetInfo( hServer,
|
||
wchType,
|
||
wchCreator,
|
||
lpwsData,
|
||
lpwsResource,
|
||
lpwsTarget,
|
||
dwParmNum);
|
||
|
||
if (dwRetCode != NO_ERROR)
|
||
PrintMessageAndExit(IDS_API_ERROR, (CHAR *)((ULONG_PTR)dwRetCode));
|
||
|
||
AfpAdminDisconnect(hServer);
|
||
|
||
PrintMessageAndExit(IDS_SUCCESS, NULL);
|
||
}
|
||
|
||
|