Complete AFP mounter program.
It can now successfully mount a volume, although only using a guest login.
This commit is contained in:
parent
f9a65d1f54
commit
7d79acda96
121
afpmounter.c
121
afpmounter.c
|
@ -15,18 +15,35 @@ typedef struct NBPLookupResultBuf {
|
||||||
EntName entName;
|
EntName entName;
|
||||||
} NBPLookupResultBuf;
|
} NBPLookupResultBuf;
|
||||||
|
|
||||||
|
char *object, *zone, *type;
|
||||||
|
|
||||||
NBPLookupResultBuf lookupResultBuf;
|
NBPLookupResultBuf lookupResultBuf;
|
||||||
NBPLookupNameRec lookupNameRec;
|
NBPLookupNameRec lookupNameRec;
|
||||||
EntName entName;
|
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 main(int argc, char **argv) {
|
||||||
int i, j;
|
int i, j;
|
||||||
int count;
|
int count;
|
||||||
|
int zoneNameOffset;
|
||||||
|
Word atRetCode;
|
||||||
|
|
||||||
if (argc < 3) {
|
if (argc < 4 || argc > 5) {
|
||||||
fprintf(stderr, "Usage: afpmounter name zone\n");
|
fprintf(stderr, "Usage: afpmounter name zone volume [volPassword]\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +55,23 @@ int main(int argc, char **argv) {
|
||||||
return;
|
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.async = 0;
|
||||||
lookupNameRec.command = nbpLookupNameCommand;
|
lookupNameRec.command = nbpLookupNameCommand;
|
||||||
lookupNameRec.completionPtr = 0;
|
lookupNameRec.completionPtr = 0;
|
||||||
|
@ -60,23 +94,90 @@ int main(int argc, char **argv) {
|
||||||
for (j = 0; j < count; j++) {
|
for (j = 0; j < count; j++) {
|
||||||
entName.buffer[i++] = type[j];
|
entName.buffer[i++] = type[j];
|
||||||
}
|
}
|
||||||
|
zoneNameOffset = i;
|
||||||
count = strlen(zone);
|
count = strlen(zone);
|
||||||
entName.buffer[i++] = count;
|
entName.buffer[i++] = count;
|
||||||
for (j = 0; j < count; j++) {
|
for (j = 0; j < count; j++) {
|
||||||
entName.buffer[i++] = zone[j];
|
entName.buffer[i++] = zone[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_CALLAT(&lookupNameRec)) {
|
atRetCode = _CALLAT(&lookupNameRec);
|
||||||
|
if (atRetCode != 0) {
|
||||||
fprintf(stderr, "NBP lookup error: %04x\n", lookupNameRec.result);
|
fprintf(stderr, "NBP lookup error: %04x\n", lookupNameRec.result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%i matches\n", lookupNameRec.actualMatch);
|
if (lookupNameRec.actualMatch == 0) {
|
||||||
if (lookupNameRec.actualMatch > 0) {
|
fprintf(stderr, "The specified server could not be found\n");
|
||||||
printf("network = %u, node = %u, socket = %u\n",
|
return;
|
||||||
ntohs(lookupResultBuf.networkNum),
|
|
||||||
lookupResultBuf.nodeNum,
|
|
||||||
lookupResultBuf.socketNum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue