diff --git a/Makefile.mk b/Makefile.mk index beef887..298b487 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -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 diff --git a/afpmounter.c b/afpmounter.c new file mode 100644 index 0000000..252920b --- /dev/null +++ b/afpmounter.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#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); + } + +}