diff -r 4659ae7bc69c -r 007508451e2c src/protocols/zephyr/ZRetSubs.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/protocols/zephyr/ZRetSubs.c Tue Jul 31 01:00:39 2001 +0000 @@ -0,0 +1,186 @@ +/* This file is part of the Project Athena Zephyr Notification System. + * It contains source for the ZRetrieveSubscriptions and + * ZRetrieveDefaultSubscriptions functions. + * + * Created by: Robert French + * + * $Source$ + * $Author: warmenhoven $ + * + * Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ +/* $Header$ */ + +#include + +#ifndef lint +static const char rcsid_ZRetrieveSubscriptions_c[] = + "$Id: ZRetSubs.c 2096 2001-07-31 01:00:39Z warmenhoven $"; +#endif + +static Code_t Z_RetSubs (); + +/* Need STDC definition when possible for unsigned short argument. */ +#ifdef __STDC__ +Code_t ZRetrieveSubscriptions(unsigned short port, int *nsubs) +#else +Code_t ZRetrieveSubscriptions(port,nsubs) + unsigned short port; + int *nsubs; +#endif +{ + int retval; + ZNotice_t notice; + char asciiport[50]; + + if (!port) /* use default port */ + port = __Zephyr_port; + + retval = ZMakeAscii16(asciiport, sizeof(asciiport), ntohs(port)); + if (retval != ZERR_NONE) + return (retval); + + (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)); +} + +Code_t ZRetrieveDefaultSubscriptions(nsubs) + int *nsubs; +{ + ZNotice_t notice; + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_message = (char *) 0; + notice.z_message_len = 0; + notice.z_opcode = CLIENT_GIMMEDEFS; + + return(Z_RetSubs(¬ice, nsubs, ZNOAUTH)); + +} + +static Code_t Z_RetSubs(notice, nsubs, auth_routine) + register ZNotice_t *notice; + int *nsubs; + Z_AuthProc auth_routine; +{ + register int i; + int retval,nrecv,gimmeack; + ZNotice_t retnotice; + char *ptr,*end,*ptr2; + + retval = ZFlushSubscriptions(); + + if (retval != ZERR_NONE && retval != ZERR_NOSUBSCRIPTIONS) + return (retval); + + if (ZGetFD() < 0) + if ((retval = ZOpenPort((u_short *)0)) != ZERR_NONE) + return (retval); + + notice->z_kind = ACKED; + notice->z_port = __Zephyr_port; + notice->z_class = ZEPHYR_CTL_CLASS; + notice->z_class_inst = ZEPHYR_CTL_CLIENT; + notice->z_sender = 0; + notice->z_recipient = ""; + notice->z_default_format = ""; + + if ((retval = ZSendNotice(notice,auth_routine)) != ZERR_NONE) + return (retval); + + nrecv = 0; + gimmeack = 0; + __subscriptions_list = (ZSubscription_t *) 0; + + while (!nrecv || !gimmeack) { + retval = Z_WaitForNotice (&retnotice, ZCompareMultiUIDPred, + ¬ice->z_multiuid, SRV_TIMEOUT); + if (retval == ZERR_NONOTICE) + return ETIMEDOUT; + else if (retval != ZERR_NONE) + return retval; + + if (retnotice.z_kind == SERVNAK) { + ZFreeNotice(&retnotice); + return (ZERR_SERVNAK); + } + /* non-matching protocol version numbers means the + server is probably an older version--must punt */ + if (strcmp(notice->z_version,retnotice.z_version)) { + ZFreeNotice(&retnotice); + return(ZERR_VERS); + } + if (retnotice.z_kind == SERVACK && + !strcmp(retnotice.z_opcode,notice->z_opcode)) { + ZFreeNotice(&retnotice); + gimmeack = 1; + continue; + } + + if (retnotice.z_kind != ACKED) { + ZFreeNotice(&retnotice); + return (ZERR_INTERNAL); + } + + nrecv++; + + end = retnotice.z_message+retnotice.z_message_len; + + __subscriptions_num = 0; + for (ptr=retnotice.z_message;ptr