Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
TestLib.c
/*------------------------------------------------------------------------------ |
# |
# TestLib.c : MPW tool to test 3 librairies : ZIP - ATP - AFP |
# |
# Zone names are displayed |
# Enter a zone name if any and validate your answer by the Enter key |
# Server names are displayed |
# Enter a server name and validate your answer by the Enter key |
# Logging as guest or with username/password is completed |
# Server time as well as volume names are displayed |
# Enter a volume name and validate your answer by the Enter key |
# Volume access rights are displayed in guest mode |
# For each directory accessible, access rights are displayed |
# |
# Versions: 1.0 10/91 |
# Built with MPW 3.2 |
# |
# C.Buttin - Apple Computer Europe |
# |
------------------------------------------------------------------------------*/ |
#include <Memory.h> |
#include <Types.h> |
#include <stdIO.h> |
#include <String.h> |
#include <Strings.h> |
#include <errors.h> |
#include <OSUtils.h> |
#include <AppleTalk.h> |
#define buffSize 5000 |
#define maxServers 40 |
/* structures used by ExtractDirInfo */ |
typedef struct InfoDir { |
short UAM; /* access right for this directory */ |
long dirID; |
Str32 dirName; |
}InfoDir; |
typedef InfoDir *InfoDirPtr; |
/* functions */ |
short DisplayZones(Ptr buffer); |
short DisplayServers(Ptr zoneName,Ptr buffer); |
Boolean GetServerAddress(Ptr theServer,AddrBlock* serverAddress,short numEntities,Ptr buffer); |
short LogOnServer(AddrBlock* serverAddress,Ptr SCBBlock,Ptr buffer); |
void DisplayVolumes(Ptr buffer,short numVol); |
void DisplayDirectories(short sessionNum,short volumeID,long dirID); |
void getAnswer(Ptr theString); |
void DisplayAccessRights(short accessRights); |
void padWithBlanks(Str32 theStr); |
/* ZIP */ |
extern pascal short GetZones(Ptr buffer,short bufsize); |
extern pascal void GetZoneName(char* buffer,short zoneNumber,char* zoneName); |
/* NBP */ |
extern pascal short NBPGetList(Ptr buffer, |
short bufSize, |
EntityPtr entity, |
short maxEntities); |
extern pascal Boolean NBPGetAddress(Ptr buffer, |
short tuplenum, |
short numEntities, |
EntityPtr entity, |
AddrBlock *address); |
/* AFP */ |
extern pascal OSErr GetServerInfo(AddrBlock *serverAddress,Ptr replyBuffer,short buffLength); |
extern pascal short LogOnwithName(AddrBlock *serverAddress,Ptr theName,Ptr thePassword,Ptr SCBBlock); |
extern pascal short LogOnAsGuest(AddrBlock *serverAddress,Ptr SCBBlock); |
extern pascal OSErr GetServerParams(short sessNum,Ptr replyBuffer,short buffLength); |
extern pascal unsigned long GetServerTime(Ptr replyBuffer); |
extern pascal short GetNumberVolumes(Ptr replyBuffer); |
extern pascal Boolean ExtractVolumeName(Ptr replyBuffer,short volumeNumber,Str255 theVol); |
extern pascal short OpenVolume(short sessNum,Ptr volumeName,short* volID); |
extern pascal void CloseVolume(short sessNum,short volumeID); |
extern pascal short GetVolumePrivileges(short sessionNum,short volumeID); |
extern pascal OSErr GetDirectories(short sessNum,short volID,long dirID, |
Ptr buffer,short buffLength,short reqCount); |
extern pascal short GetNumberDirs(Ptr replyBuffer); |
extern pascal Boolean ExtractDirInfo(Ptr replyBuffer,short dirNumber,InfoDirPtr theDir); |
extern pascal OSErr LogOut(short sessNum,Ptr SCBBlock); |
extern pascal Boolean CheckUAM(const Str32 theMethod,Ptr replyBuffer); |
main() |
{ |
short sessionNum,numVol,numEntities; |
short volumeID,result; |
Ptr buffer; |
Str32 zoneName,theServer,theVol; |
AddrBlock serverAddress; |
char SCBBlock[scbMemSize]; /* used by AFP to manage a session */ |
OSErr error; |
short accessRights; |
DateTimeRec theDate; |
/* allocate a buffer to retrieve info */ |
if (!(buffer = NewPtr(buffSize))) { |
printf("buffer too small"); |
return; |
} |
/* Display list of zones */ |
if ((result = DisplayZones(buffer)) < 0) { /* an error occured */ |
DisposePtr(buffer); |
return; |
} |
else |
if (result >0) { |
/* get selected zone */ |
printf("\n\nselect a zone : \n"); |
getAnswer(zoneName); |
if (*zoneName == 0) /* no zone selected */ |
return; |
} |
else /* no zone available */ |
sprintf(zoneName,"\p*"); |
/* get AppleShare servers in that zone */ |
if ((numEntities = DisplayServers(c2pstr(zoneName), buffer)) == 0) { /* an error occured */ |
DisposePtr(buffer); |
return; |
} |
/* Get selected server and look for its address */ |
printf("\nGive the server name :\n"); |
getAnswer(theServer); |
if (!GetServerAddress(theServer,&serverAddress,numEntities,buffer)) { /* an error occured */ |
DisposePtr(buffer); |
return; |
} |
/* Connect to server */ |
if ((sessionNum = LogOnServer(&serverAddress,&SCBBlock,buffer)) <= 0) { /* an error occured */ |
DisposePtr(buffer); |
return; |
} |
/* get server information and volume list */ |
if ((error = GetServerParams(sessionNum,buffer,buffSize)) != noErr) |
printf("Error in getting server params : %d\n",error); |
else { |
Secs2Date(GetServerTime(buffer),&theDate); |
printf("Server Time : %d/%d/%d \t%d:%d:%d\n", theDate.day,theDate.month,theDate.year, |
theDate.hour,theDate.minute,theDate.second); |
numVol = GetNumberVolumes(buffer); |
if (numVol > 0) { |
DisplayVolumes(buffer,numVol); |
/* Get a volume name and open it */ |
printf("\nGive the volume name :\n"); |
getAnswer(theVol); |
if (*theVol == 0) /* no volume selected */ |
return; |
if ((error = OpenVolume(sessionNum,c2pstr(theVol),&volumeID)) == noErr) { |
accessRights = GetVolumePrivileges(sessionNum,volumeID); |
printf("\nVolume : %s ",p2cstr(theVol)); |
DisplayAccessRights(accessRights); |
DisplayDirectories(sessionNum,volumeID,2); /* dirID of the root is 2 */ |
CloseVolume(sessionNum,volumeID); |
} |
else |
printf("Can't open volume:%d",error); |
} |
} |
LogOut(sessionNum,&SCBBlock); |
DisposePtr(buffer); |
} |
/* DisplayZones : display all the zone names. |
return : -1 an error occured |
0 no zone available |
1 list of zones */ |
short DisplayZones(Ptr buffer) |
{ |
short i,numZones; |
Str32 zoneName; |
/* get zone list */ |
if ((numZones = GetZones(buffer,buffSize)) < 0) { |
printf("Error in getting zones : %d\n",numZones); |
return -1; |
} |
else { |
if (numZones == 0) { |
printf("\nNo Zone available"); |
return 0; |
} |
else { |
for (i = 1; i <= numZones;i++) { |
GetZoneName(buffer,i,zoneName); |
padWithBlanks(p2cstr(zoneName)); |
printf("\t\t%s",zoneName); |
if (i % 3 == 0) |
printf("\n"); |
} |
return 1; |
} |
} |
} /* DisplayZones */ |
short DisplayServers(Ptr zoneName,Ptr buffer) |
{ |
short i,numEntities; |
AddrBlock serverAddress; |
EntityName entity; |
/* prepare the entities we are looking for */ |
NBPSetEntity((Ptr)&entity,"\p=","\pAFPServer",zoneName); |
if ((numEntities = NBPGetList(buffer,buffSize,&entity,maxServers)) <= 0) { |
printf("Error in getting entities :%d",numEntities); |
return 0; |
} |
/* list AppleShare servers */ |
printf("\n"); |
for (i = 1; i <= numEntities ; i++) |
if (NBPGetAddress(buffer,i,numEntities,&entity,&serverAddress)) { |
/* pad server name with blanks to display nicely */ |
padWithBlanks(p2cstr(entity.objStr)); |
printf("Server :\t%s\t\tZone : \t%s\n",entity.objStr, |
p2cstr(entity.zoneStr)); |
} |
return numEntities; |
} /* DisplayServers */ |
Boolean GetServerAddress(Ptr theServer,AddrBlock* serverAddress,short numEntities,Ptr buffer) |
{ |
short i; |
EntityName entity; |
for (i = 1; i <= numEntities ; i++) { |
NBPGetAddress(buffer,i,numEntities,&entity,serverAddress); |
if (strcmp(p2cstr(entity.objStr),theServer) == 0) |
break; |
} |
if (i > numEntities) { |
printf("Server not found\n"); |
return false; |
} |
printf("Address : \tNet : %ld\tNode : %d\tSocket : %d\n",serverAddress->aNet, |
serverAddress->aNode, |
serverAddress->aSocket); |
return true; |
} /* GetServerAddress */ |
/* establish a connection to the server */ |
short LogOnServer(AddrBlock* serverAddress,Ptr SCBBlock,Ptr buffer) |
{ |
short sessionNum; |
OSErr error; |
Str32 theName,temp; |
char thePassword[8]; |
Boolean connectAsGuest; |
connectAsGuest = true; |
/* look to connect with a username password by checking the UAMs */ |
if ((error = GetServerInfo(serverAddress,buffer,buffSize)) != noErr) { |
printf("Error in getting server Information : %d\n",error); |
return 0; |
} |
/* verify access methods */ |
connectAsGuest = true; |
if (CheckUAM("\pCleartxt passwrd",buffer)) { |
/* ask user if he wants to connect with user name password */ |
printf("Do you want to connect to the server as guest : 1 yes, 0 no ?\n"); |
getAnswer(temp); |
if (strcmp(temp,"0") == 0) { |
connectAsGuest = false; |
/* get username and password and log on */ |
printf("UserName :\n"); |
getAnswer(theName); |
printf("Password :\n"); |
getAnswer(thePassword); |
sessionNum = LogOnwithName(serverAddress,c2pstr(theName),c2pstr(thePassword),SCBBlock); |
if (sessionNum > 0) |
printf("\n%s : Logging on server completed\n",p2cstr(theName)); |
} |
} |
if (connectAsGuest) { |
/* connect to server as guest, if possible */ |
if (CheckUAM("\pNo User Authent",buffer)) { |
sessionNum = LogOnAsGuest(serverAddress,SCBBlock); |
if (sessionNum > 0) |
printf("\nLogging on server as guest completed\n"); |
} |
else { |
printf("\nLogging on server as guest impossible\n"); |
sessionNum = 0; |
} |
} |
if (sessionNum < 0) |
printf("Error in loging to server : %d\n",sessionNum); |
return sessionNum; |
} /* LogOnServer */ |
void DisplayVolumes(Ptr buffer,short numVol) |
{ |
short i; |
Str32 theVol; |
printf("\nNumber of volumes : %d\n",numVol); |
printf("Volumes :\n"); |
for (i = 1; i <= numVol;i++) |
if (ExtractVolumeName(buffer,i,theVol)) |
printf("\t%s\n",p2cstr(theVol)); |
} /* DisplayVolumes */ |
void DisplayDirectories(short sessionNum,short volumeID,long dirID) |
{ |
OSErr error; |
short i,j,numDir; |
InfoDir theDir; |
static short theTab = -1; |
Ptr buffer; |
/* allocate a buffer to receive the information */ |
if (!(buffer = NewPtr(buffSize))) { |
printf("DisplayDirectories buffer too small\n"); |
return; |
} |
/* retrieve directory info */ |
if ((error = GetDirectories(sessionNum,volumeID,dirID,buffer,buffSize,20)) != noErr) |
if (error == afpObjectNotFound) { /* we have browse a whole branch */ |
DisposPtr(buffer); |
return; |
} |
/* get number of directories */ |
if ((numDir = GetNumberDirs(buffer)) <= 0) |
return; |
if (theTab < 0) { |
printf("\nDirectories and access rights :\n"); |
theTab = 0; |
} |
/* retrieve info about each directory, display it and go on recursively if we have access |
rights */ |
for (i = 1; i <= numDir;i++) { |
/* extract info and print it */ |
if (ExtractDirInfo(buffer,i,&theDir)) { |
for (j = 0; j < theTab;j++) |
printf("\t"); |
/* pad with Blanks to get a nice display */ |
padWithBlanks(p2cstr(theDir.dirName)); |
printf("%s ",theDir.dirName); |
DisplayAccessRights(theDir.UAM); |
/* look for subdirectories if possible */ |
if (theDir.UAM & 0xF1) { |
theTab++; |
DisplayDirectories(sessionNum,volumeID,theDir.dirID); |
theTab--; |
} |
} |
} |
DisposPtr(buffer); |
} /* DisplayDirectories */ |
/* get from user a C string */ |
void getAnswer(Ptr theString) |
{ |
short i; |
i = 0; |
do { |
scanf("%c",theString+i); /* a zone name can contains white spaces */ |
i++; /* so we get it char by char */ |
} |
while (*(theString+i-1) != '\n'); |
*(theString+i-1) = '\0'; |
} /* getAnswer */ |
void DisplayAccessRights(short accessRights) |
{ |
Str255 theStr; |
*theStr = 0; |
if (accessRights == 0) /* no access to guest */ |
printf("No access for guest\n"); |
else { |
if (accessRights & 0xF4) |
strcat(theStr,"Make Changes "); |
if (accessRights & 0xF2) |
strcat(theStr,"See Files "); |
if (accessRights & 0xF1) |
strcat(theStr,"See Folders"); |
printf("%s\n",theStr); |
} |
} /* DisplayAccessRights */ |
/* pad text with blanks to display nicely */ |
void padWithBlanks(Str32 theStr) |
{ |
short i; |
for (i = strlen(theStr); i < 31;theStr[i] = ' ',i++); |
theStr[31] = '\0'; |
} /* padWithBlanks */ |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14