Start writing AFP mounter program/test case.

Currently this just does an NBP lookup.
This commit is contained in:
Stephen Heumann 2017-03-23 20:47:51 -05:00
parent 6367b37e6f
commit f9a65d1f54
2 changed files with 102 additions and 5 deletions

View File

@ -1,11 +1,26 @@
CFLAGS = -i -w
OBJS = dsitest.o aspinterface.o dsi.o readtcp.o endian.o tcpconnection.o atipmapping.o
PROG = dsitest
DSITEST_OBJS = dsitest.o aspinterface.o dsi.o readtcp.o endian.o tcpconnection.o atipmapping.o
DSITEST_PROG = dsitest
$(PROG): $(OBJS)
occ $(CFLAGS) -o $@ $(OBJS)
AFPMOUNTER_OBJS = afpmounter.o callat.o endian.o
AFPMOUNTER_PROG = afpmounter
.PHONY: default
default: $(DSITEST_PROG) $(AFPMOUNTER_PROG)
$(DSITEST_PROG): $(DSITEST_OBJS)
occ $(CFLAGS) -o $@ $(DSITEST_OBJS)
$(AFPMOUNTER_PROG): $(AFPMOUNTER_OBJS)
occ $(CFLAGS) -o $@ $(AFPMOUNTER_OBJS)
endian.o: endian.asm
occ $(CFLAGS) -c $<
callat.o: callat.asm
occ $(CFLAGS) -c $<
.PHONY: clean
clean:
$(RM) $(OBJS) $(PROG)
$(RM) $(DSITEST_OBJS) $(DSITEST_PROG) $(AFPMOUNTER_PROG) $(AFPMOUNTER_OBJS) > .null

82
afpmounter.c Normal file
View File

@ -0,0 +1,82 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <appletalk.h>
#include "endian.h"
#define ENTITY_FIELD_MAX 32
typedef struct NBPLookupResultBuf {
Word networkNum;
Byte nodeNum;
Byte socketNum;
// First enumerator/name only
Byte enumerator;
EntName entName;
} NBPLookupResultBuf;
NBPLookupResultBuf lookupResultBuf;
NBPLookupNameRec lookupNameRec;
EntName entName;
char *object, *zone, *type;
int main(int argc, char **argv) {
int i, j;
int count;
if (argc < 3) {
fprintf(stderr, "Usage: afpmounter name zone\n");
return;
}
object = argv[1];
type = "AFPServer";
zone = argv[2];
if (strlen(object) > ENTITY_FIELD_MAX || strlen(zone) > ENTITY_FIELD_MAX) {
fprintf(stderr, "Entity name too long (max 32 chars)\n");
return;
}
lookupNameRec.async = 0;
lookupNameRec.command = nbpLookupNameCommand;
lookupNameRec.completionPtr = 0;
lookupNameRec.entityPtr = (LongWord)&entName;
lookupNameRec.rInterval = 1;
lookupNameRec.rCount = 20;
lookupNameRec.reserved = 0;
lookupNameRec.bufferLength = sizeof(lookupResultBuf);
lookupNameRec.bufferPtr = (LongWord)&lookupResultBuf;
lookupNameRec.maxMatch = 1;
i = 0;
count = strlen(object);
entName.buffer[i++] = count;
for (j = 0; j < count; j++) {
entName.buffer[i++] = object[j];
}
count = strlen(type);
entName.buffer[i++] = count;
for (j = 0; j < count; j++) {
entName.buffer[i++] = type[j];
}
count = strlen(zone);
entName.buffer[i++] = count;
for (j = 0; j < count; j++) {
entName.buffer[i++] = zone[j];
}
if (_CALLAT(&lookupNameRec)) {
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);
}
}