Mercurial > pidgin
diff libpurple/protocols/zephyr/ZSendPkt.c @ 15373:5fe8042783c1
Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sat, 20 Jan 2007 02:32:10 +0000 |
parents | |
children | aaaff38e144f a8cc50c2279f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/zephyr/ZSendPkt.c Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,63 @@ +/* This file is part of the Project Athena Zephyr Notification System. + * It contains source for the ZSendPacket function. + * + * Created by: Robert French + * + * Copyright (c) 1987,1991 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ + +#include "internal.h" +#ifdef WIN32 +#include <winsock.h> +#else +#include <sys/socket.h> +#endif + +static int wait_for_hmack(ZNotice_t *notice, void *uid); + +Code_t ZSendPacket(packet, len, waitforack) + char *packet; + int len; + int waitforack; +{ + Code_t retval; + struct sockaddr_in dest; + ZNotice_t notice, acknotice; + + if (!packet || len < 0) + return (ZERR_ILLVAL); + + if (len > Z_MAXPKTLEN) + return (ZERR_PKTLEN); + + if (ZGetFD() < 0) + if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE) + return (retval); + + dest = ZGetDestAddr(); + + if (sendto(ZGetFD(), packet, len, 0, (struct sockaddr *)&dest, + sizeof(dest)) < 0) + return (errno); + + if (!waitforack) + return (ZERR_NONE); + + if ((retval = ZParseNotice(packet, len, ¬ice)) != ZERR_NONE) + return (retval); + + retval = Z_WaitForNotice (&acknotice, wait_for_hmack, ¬ice.z_uid, + HM_TIMEOUT); + if (retval == ETIMEDOUT) + return ZERR_HMDEAD; + if (retval == ZERR_NONE) + ZFreeNotice (&acknotice); + return retval; +} + +static int wait_for_hmack(ZNotice_t *notice, void *uid) +{ + return (notice->z_kind == HMACK && ZCompareUID(¬ice->z_uid, (ZUnique_Id_t *)uid)); +}