Complete AFP mounter program.

It can now successfully mount a volume, although only using a guest login.
This commit is contained in:
Stephen Heumann 2017-03-24 01:40:48 -05:00
parent f9a65d1f54
commit 7d79acda96
1 changed files with 111 additions and 10 deletions

View File

@ -15,18 +15,35 @@ typedef struct NBPLookupResultBuf {
EntName entName;
} NBPLookupResultBuf;
char *object, *zone, *type;
NBPLookupResultBuf lookupResultBuf;
NBPLookupNameRec lookupNameRec;
EntName entName;
char *object, *zone, *type;
#define kFPLogin 18
char *afpVersionStr, *uamStr;
unsigned char fpLoginCmdRec[128];
unsigned char replyBuffer[1024];
PFILogin2Rec login2Rec;
#define VOL_NAME_MAX 27
#define VOL_PASSWORD_MAX 8
PFIMountvolRec mountVolRec;
unsigned char volName[VOL_NAME_MAX + 1];
unsigned char volPassword[VOL_PASSWORD_MAX] = {0};
PFILogoutRec logoutRec;
int main(int argc, char **argv) {
int i, j;
int count;
int zoneNameOffset;
Word atRetCode;
if (argc < 3) {
fprintf(stderr, "Usage: afpmounter name zone\n");
if (argc < 4 || argc > 5) {
fprintf(stderr, "Usage: afpmounter name zone volume [volPassword]\n");
return;
}
@ -38,6 +55,23 @@ int main(int argc, char **argv) {
return;
}
count = strlen(argv[3]);
if (count > VOL_NAME_MAX) {
fprintf(stderr, "Volume name too long\n");
return;
}
volName[0] = count;
strncpy(volName+1, argv[3], count);
if (argc >= 5) {
count = strlen(argv[4]);
if (count > VOL_PASSWORD_MAX) {
fprintf(stderr, "Volume password too long\n");
return;
}
strncpy(volPassword, argv[4], count);
}
lookupNameRec.async = 0;
lookupNameRec.command = nbpLookupNameCommand;
lookupNameRec.completionPtr = 0;
@ -60,23 +94,90 @@ int main(int argc, char **argv) {
for (j = 0; j < count; j++) {
entName.buffer[i++] = type[j];
}
zoneNameOffset = i;
count = strlen(zone);
entName.buffer[i++] = count;
for (j = 0; j < count; j++) {
entName.buffer[i++] = zone[j];
}
if (_CALLAT(&lookupNameRec)) {
atRetCode = _CALLAT(&lookupNameRec);
if (atRetCode != 0) {
fprintf(stderr, "NBP lookup error: %04x\n", lookupNameRec.result);
return;
}
printf("%i matches\n", lookupNameRec.actualMatch);
if (lookupNameRec.actualMatch > 0) {
printf("network = %u, node = %u, socket = %u\n",
ntohs(lookupResultBuf.networkNum),
lookupResultBuf.nodeNum,
lookupResultBuf.socketNum);
if (lookupNameRec.actualMatch == 0) {
fprintf(stderr, "The specified server could not be found\n");
return;
}
#if 0
printf("%i matches\n", lookupNameRec.actualMatch);
printf("network = %u, node = %u, socket = %u\n",
ntohs(lookupResultBuf.networkNum),
lookupResultBuf.nodeNum,
lookupResultBuf.socketNum);
#endif
i = 0;
fpLoginCmdRec[i++] = kFPLogin;
afpVersionStr = "AFPVersion 2.0";
count = strlen(afpVersionStr);
fpLoginCmdRec[i++] = count;
for(j = 0; j < count; j++) {
fpLoginCmdRec[i++] = afpVersionStr[j];
}
uamStr = "No User Authent";
count = strlen(uamStr);
fpLoginCmdRec[i++] = count;
for(j = 0; j < count; j++) {
fpLoginCmdRec[i++] = uamStr[j];
}
login2Rec.async = 0;
login2Rec.command = pfiLogin2Command;
login2Rec.networkID = lookupResultBuf.networkNum;
login2Rec.nodeID = lookupResultBuf.nodeNum;
login2Rec.socketID = lookupResultBuf.socketNum;
login2Rec.cmdBufferLength = i;
login2Rec.cmdBufferPtr = (LongWord)&fpLoginCmdRec;
login2Rec.replyBufferLen = sizeof(replyBuffer);
login2Rec.replyBufferPtr = (LongWord)&replyBuffer;
login2Rec.attnRtnAddr = 0;
login2Rec.serverName = &entName.buffer[0];
login2Rec.zoneName = &entName.buffer[zoneNameOffset];
login2Rec.afpVersionNum = pfiAFPVersion20;
atRetCode = _CALLAT(&login2Rec);
if (atRetCode != 0) {
fprintf(stderr, "Login failure: %04x\n", login2Rec.result);
if (login2Rec.result == pfiLoginContErr)
goto logout_and_exit;
return;
}
mountVolRec.async = 0;
mountVolRec.command = pfiMountVolCommand;
mountVolRec.sessRefID = login2Rec.sessRefID;
mountVolRec.mountflag = pfiMountMask | pfiPasswordMask;
mountVolRec.volNamePtr = (LongWord)&volName;
mountVolRec.passwordPtr = (LongWord)&volPassword;
atRetCode = _CALLAT(&mountVolRec);
if (atRetCode != 0) {
fprintf(stderr, "Failed to mount volume: %04x\n", mountVolRec.result);
goto logout_and_exit;
}
/* success - leave the volume mounted */
return;
logout_and_exit:
logoutRec.async = 0;
logoutRec.command = pfiLogOutCommand;
logoutRec.sessRefID = login2Rec.sessRefID;
_CALLAT(&logoutRec);
return;
}