/* This file is part of the Project Athena Zephyr Notification System. * It contains source for the ZSubscribeTo, ZUnsubscribeTo, and * ZCancelSubscriptions functions. * Created by: Robert French * Copyright (c) 1987,1988 by the Massachusetts Institute of Technology. * For copying and distribution information, see the file static Code_t Z_Subscriptions(register ZSubscription_t *sublist, int nitems, unsigned int port, char *opcode, int authit); static Code_t subscr_sendoff(ZNotice_t *notice, char **lyst, int num, Code_t ZSubscribeTo(sublist, nitems, port) ZSubscription_t *sublist; return (Z_Subscriptions(sublist, nitems, port, CLIENT_SUBSCRIBE, 1)); Code_t ZSubscribeToSansDefaults(sublist, nitems, port) ZSubscription_t *sublist; return (Z_Subscriptions(sublist, nitems, port, CLIENT_SUBSCRIBE_NODEFS, Code_t ZUnsubscribeTo(sublist, nitems, port) ZSubscription_t *sublist; return (Z_Subscriptions(sublist, nitems, port, CLIENT_UNSUBSCRIBE, 1)); Code_t ZCancelSubscriptions(port) return (Z_Subscriptions((ZSubscription_t *)0, 0, port, * This routine must do its own fragmentation. Subscriptions must * not be broken across packet boundaries, or else the server will Z_Subscriptions(sublist, nitems, port, opcode, authit) register ZSubscription_t *sublist; char header[Z_MAXHEADERLEN]; int size_avail = Z_MAXPKTLEN-Z_FRAGFUDGE; /* space avail for data, /* nitems = 0 means cancel all subscriptions; still need to allocate a */ /* array for one item so we can cancel, however. */ list = (char **)malloc((unsigned)((nitems==0)?1:nitems)*3*sizeof(char *)); (void) memset((char *)¬ice, 0, sizeof(notice)); notice.z_class = ZEPHYR_CTL_CLASS; notice.z_class_inst = ZEPHYR_CTL_CLIENT; notice.z_opcode = opcode; notice.z_default_format = ""; notice.z_message_len = 0; /* format the header to figure out how long it is */ retval = Z_FormatHeader(¬ice, header, sizeof(header), &hdrlen, ZAUTH); if (retval != ZERR_NONE && !authit) retval = Z_FormatHeader(¬ice, header, sizeof(header), if (retval != ZERR_NONE) { /* compute amount of room left */ /* assemble subs into an array of pointers */ list[i*3] = sublist[i].zsub_class; list[i*3+1] = sublist[i].zsub_classinst; recip = sublist[i].zsub_recipient; if (recip && *recip == '*') if (!recip || (*recip != 0 && *recip != '@')) /* there aren't really any, but we need to xmit anyway */ retval = subscr_sendoff(¬ice, list, 0, authit); if ((j = strlen(list[i*3]) + strlen(list[i*3+2]) + 3) <= size) { /* it will fit in this packet */ if (!numok) { /* a single subscription won't retval = subscr_sendoff(¬ice, &list[start*3], numok, authit); retval = subscr_sendoff(¬ice, &list[start*3], numok, authit); subscr_sendoff(notice, lyst, num, authit) retval = ZSendList(notice, lyst, num*3, ZAUTH); if (retval != ZERR_NONE && !authit) retval = ZSendList(notice, lyst, num*3, ZNOAUTH); if ((retval = ZIfNotice(&retnotice, (struct sockaddr_in *)0, ZCompareUIDPred, (char *)¬ice->z_uid)) != if (retnotice.z_kind == SERVNAK) { if (retnotice.z_kind != SERVACK) {