This is abzip.c in view mode; [Download] [Up]
/* * $Author: cck $ $Date: 88/03/19 20:55:18 $ * $Header: abzip.c,v 1.3 88/03/19 20:55:18 cck Rel $ * $Revision: 1.3 $ */ /* * abzip.c - AppleTalk Zone Information Protocol * * Only support for GetZoneList. GetMyZone is faked. * * MUST BE RUNNING KIP 1/88 or later to work properly (KIP 9/87 was the first * revision with zones, but the code didn't return properly) * * AppleTalk package for UNIX (4.2 BSD). * * Copyright (c) 1986, 1987, 1988 by The Trustees of Columbia University in the * City of New York. * * Edit History: * * March 1988, CCKim Create * */ #include <stdio.h> #include <sys/types.h> #include <netinet/in.h> /* so htons() works for non-vax */ #include <netat/appletalk.h> /* include appletalk definitions */ /* move these defines to appletalk.h */ #ifndef zip_GetMyZone /* in case defined */ /* define atp zip commands */ #define zip_GetMyZone 7 /* get my zone command */ #define zip_GetZoneList 8 /* get zone list command */ /* atp user bytes for zip commands */ /* no reply struct since return is packed array of pascal strings */ typedef struct zipUserBytes { byte zip_cmd; /* zip command (LastFlag on return) */ byte zip_zero; /* always zero */ word zip_index; /* zip index (count on return) */ } zipUserBytes; #endif /* * send a get zone list command to our bridge * arguments: * start_index: zone start index (first is 1) * buffer to return zone list reply in - must be atpMaxData * zipuserbytes: on noErr return: set to user bytes returned by bridge * */ OSErr atpgetzonelist(start_index, buf, zipuserbytes) int start_index; char *buf; zipUserBytes *zipuserbytes; { AddrBlock addr; BDS bds[1]; /* 1 for zip */ import u_short bridge_net; import u_char bridge_node; zipUserBytes *zub; atpProto *ap; ABusRecord abr; OSErr err; ap = &abr.proto.atp; ap->atpUserData = 0L; zub = (zipUserBytes *)&ap->atpUserData; zub->zip_cmd = zip_GetZoneList; zub->zip_zero = 0; zub->zip_index = htons(start_index); /* start at 1 */ addr.net = bridge_net; addr.node = bridge_node; addr.skt = ddpZIP; ap->atpAddress.net = bridge_net; ap->atpAddress.node = bridge_node; ap->atpAddress.skt = ddpZIP; ap->atpSocket = 0; ap->atpReqCount = 0; ap->atpDataPtr = 0; ap->atpNumBufs = 1; bds[0].buffPtr = buf; /* expect single reply from kip */ bds[0].buffSize = atpMaxData; bds[0].userData = 0L; ap->atpRspBDSPtr = bds; ap->fatpXO = 0; ap->atpTimeOut = 4; ap->atpRetries = 3; /* send off request */ err = ATPSndRequest(&abr, FALSE); if (err == noErr) bcopy(&bds[0].userData, zipuserbytes, sizeof(bds[0].userData)); return(err); } /* * Given an array of char pointers * return: array filled with pointers to zone names (malloc'ed) * up the the size of the array * return: the real count in realcnt * return: any errors * */ OSErr GetZoneList(zones, numzones, realcnt) byte *zones[]; int numzones; int *realcnt; { OSErr err; byte *bp; byte *p; byte buf[atpMaxData+1]; int gotcnt, zc, zi, i; zipUserBytes zub; /* setup GetZoneList command */ zc = 0; zi = 1; do { if ((err=atpgetzonelist(zi, buf, &zub)) != noErr) return(err); gotcnt = ntohs(zub.zip_index); /* get count */ if (gotcnt && numzones) { for (bp = buf, i = 0; i < gotcnt; i++) { if (numzones) { p = (byte *)malloc(*bp+1); /* room for string */ cpyp2cstr(p, bp); /* copy out */ zones[zc++] = p; /* mark it */ numzones--; } bp += (*bp + 1); } } zi += gotcnt; /* new index */ } while (zub.zip_cmd == 0); *realcnt = zi - 1; return(noErr); } /* * Don't ask bridge because it may be in a different zone * */ char * GetMyZone() { extern char this_zone[]; return(this_zone); } /* * Get rid of memory malloc'ed by GetZoneList * */ FreeZoneList(zones, cnt) char **zones; int cnt; { while (cnt--) { if (zones[cnt]) free(zones[cnt]); zones[cnt] = NULL; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.