Mercurial > pidgin.yaz
view libpurple/protocols/zephyr/ZSendPkt.c @ 29681:4548c114e953
propagate from branch 'im.pidgin.pidgin' (head 371b6104658ad98c418ac711643192c2e34428ea)
to branch 'im.pidgin.cpw.attention_ui' (head 2b6154716621ea07b8e3ea452bace17539e83494)
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Sun, 26 Apr 2009 20:01:17 +0000 |
parents | 5fe8042783c1 |
children | aaaff38e144f a8cc50c2279f |
line wrap: on
line source
/* 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)); }