--- deliantra/server/socket/lowlevel.C 2007/02/04 21:02:54 1.33 +++ deliantra/server/socket/lowlevel.C 2007/04/02 19:56:11 1.37 @@ -204,7 +204,7 @@ {"reply", SC(ReplyCmd) 0 }, {"exti", SC(ExtiCmd) 0 }, /* CF+ */ {"addme", SC(AddMeCmd) 0 }, - {"askface", SC(SendFaceCmd) 0 }, /* Added: phil */ + {"askface", SC(AskFaceCmd) 0 }, {"requestinfo", SC(RequestInfo) 0 }, {"setfacemode", SC(SetFaceMode) 0 }, {"setsound", SC(SetSound) 0 }, @@ -411,8 +411,6 @@ client::send (void *buf_, int len) { char *buf = (char *)buf_; - char *pos = buf; - int amt = 0; if (destroyed () || !buf) return; @@ -420,7 +418,9 @@ if (len + outputbuffer.len > SOCKETBUFSIZE) { LOG (llevDebug, "socket on fd %d has overrun internal buffer - marking as dead\n", fd); - destroy (); + // shutdown the socket, this is safer than destroying it immediately + // as lots of code in the callchain might still access the map etc. + shutdown (fd, SHUT_RDWR); return; } @@ -506,6 +506,12 @@ send_packet (sl); } +void +client::send_drawinfo (const char *msg, int flags) +{ + send_packet_printf ("drawinfo %d %s", flags, msg); +} + /*********************************************************************** * * packet functions/utilities @@ -521,6 +527,24 @@ *cur++ = ' '; } +packet &packet::operator <<(const ber32 v) +{ + enum { maxlen = 32 / 7 + 1}; + uint8 buf[maxlen]; + uint8 *p = buf + maxlen; + uint32 val = v.val; + + while (val > 0x7F) + { + *--p = (val & 0x7F) | 0x80; + val >>= 7; + } + + *--p = val; + + return *this << data (p, buf + maxlen - p); +} + packet &packet::operator <<(const data &v) { if (room () < v.len)