/* This file is part of the Project Athena Zephyr Notification System. * It contains source for the ZRetrieveSubscriptions and * ZRetrieveDefaultSubscriptions functions. * Created by: Robert French * Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology. * For copying and distribution information, see the file static Code_t Z_RetSubs(ZNotice_t *notice, int *nsubs, Z_AuthProc auth_routine); Code_t ZRetrieveSubscriptions(unsigned short port, int *nsubs) if (!port) /* use default port */ retval = ZMakeAscii16(asciiport, sizeof(asciiport), ntohs(port)); (void) memset((char *)¬ice, 0, sizeof(notice)); notice.z_message = asciiport; notice.z_message_len = strlen(asciiport)+1; notice.z_opcode = CLIENT_GIMMESUBS; return(Z_RetSubs(¬ice, nsubs, ZAUTH)); static Code_t Z_RetSubs(notice, nsubs, auth_routine) register ZNotice_t *notice; int retval,nrecv,gimmeack; retval = ZFlushSubscriptions(); if (retval != ZERR_NONE && retval != ZERR_NOSUBSCRIPTIONS) if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE) notice->z_port = __Zephyr_port; notice->z_class = ZEPHYR_CTL_CLASS; notice->z_class_inst = ZEPHYR_CTL_CLIENT; notice->z_recipient = ""; notice->z_default_format = ""; if ((retval = ZSendNotice(notice,auth_routine)) != ZERR_NONE) __subscriptions_list = (ZSubscription_t *) 0; while (!nrecv || !gimmeack) { retval = Z_WaitForNotice (&retnotice, ZCompareMultiUIDPred, ¬ice->z_multiuid, SRV_TIMEOUT); if (retval == ZERR_NONOTICE) else if (retval != ZERR_NONE) if (retnotice.z_kind == SERVNAK) { /* non-matching protocol version numbers means the server is probably an older version--must punt */ if (!purple_strequal(notice->z_version,retnotice.z_version)) { if (retnotice.z_kind == SERVACK && purple_strequal(retnotice.z_opcode,notice->z_opcode)) { if (retnotice.z_kind != ACKED) { end = retnotice.z_message+retnotice.z_message_len; for (ptr=retnotice.z_message;ptr<end;ptr++) __subscriptions_num = __subscriptions_num / 3; if (!__subscriptions_num) { free(__subscriptions_list); __subscriptions_list = (ZSubscription_t *) malloc((unsigned)(__subscriptions_num* sizeof(ZSubscription_t))); if (!__subscriptions_list) { for (ptr=retnotice.z_message,i = 0; i< __subscriptions_num; i++) { __subscriptions_list[i].zsub_class = (char *) if (!__subscriptions_list[i].zsub_class) { g_strlcpy(__subscriptions_list[i].zsub_class,ptr,len); __subscriptions_list[i].zsub_classinst = (char *) if (!__subscriptions_list[i].zsub_classinst) { g_strlcpy(__subscriptions_list[i].zsub_classinst,ptr,len); __subscriptions_list[i].zsub_recipient = (char *) if (!__subscriptions_list[i].zsub_recipient) { g_strlcpy(__subscriptions_list[i].zsub_recipient,ptr2,len); __subscriptions_next = 0; *nsubs = __subscriptions_num;