workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
break;
case 0x000a:
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x000a, workingPtr);
+ workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr);
break;
case 0x000f:
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x000f, workingPtr);
case 0x000a:
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0004, 0x000a, workingPtr);
break;
+ case 0x000c:
+ workingPtr->handled = aim_parse_msgack_middle(sess, workingPtr);
+ break;
default:
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_DEFAULT, workingPtr);
}
return 0;
}
+int aim_parse_msgack_middle(struct aim_session_t *sess, struct command_rx_struct *command)
+{
+ rxcallback_t userfunc = NULL;
+ char sn[MAXSNLEN];
+ unsigned short type;
+ int i = 10+8; /* skip SNAC and cookie */
+ int ret = 1;
+ unsigned char snlen;
+
+ type = aimutil_get16(command->data+i);
+ i += 2;
+
+ snlen = aimutil_get8(command->data+i);
+ i++;
+
+ memset(sn, 0, sizeof(sn));
+ strncpy(sn, command->data+i, snlen);
+
+ if ((userfunc = aim_callhandler(command->conn, 0x0004, 0x000c)))
+ ret = userfunc(sess, command, type, sn);
+
+ return ret;
+}
+
+int aim_parse_ratechange_middle(struct aim_session_t *sess, struct command_rx_struct *command)
+{
+ rxcallback_t userfunc = NULL;
+ int ret = 1;
+ unsigned long newrate;
+
+ if (command->commandlen != 0x2f) {
+ printf("faim: unknown rate change length 0x%04x\n", command->commandlen);
+ return 1;
+ }
+
+ newrate = aimutil_get32(command->data+34);
+
+ if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x000a)))
+ ret = userfunc(sess, command, newrate);
+
+ return ret;
+}
+
int aim_parsemotd_middle(struct aim_session_t *sess,
struct command_rx_struct *command, ...)
{
/*
* TLVs follow
*/
- tlvlist = aim_readtlvchain(command->data+12, command->commandlen-12);
-
- msg = aim_gettlv_str(tlvlist, 0x000b, 1);
+ if (!(tlvlist = aim_readtlvchain(command->data+12, command->commandlen-12)))
+ return ret;
+
+ if (!(msg = aim_gettlv_str(tlvlist, 0x000b, 1))) {
+ aim_freetlvchain(&tlvlist);
+ return ret;
+ }
userfunc = aim_callhandler(command->conn, 0x0001, 0x0013);
if (userfunc)
ret = userfunc(sess, command, id, msg);
aim_freetlvchain(&tlvlist);
+ free(msg);
- return ret;
-
+ return ret;
}
int aim_handleredirect_middle(struct aim_session_t *sess,
if (!(ip = aim_gettlv_str(tlvlist, 0x0005, 1)))
{
printf("libfaim: major bug: no IP in tlvchain from redirect (service 0x%02x)\n", serviceid);
+ free(ip);
aim_freetlvchain(&tlvlist);
return ret;
}
if (!(tmptlv = aim_gettlv(tlvlist, 0x0006, 1)))
{
printf("libfaim: major bug: no cookie in tlvchain from redirect (service 0x%02x)\n", serviceid);
+ free(ip);
aim_freetlvchain(&tlvlist);
return ret;
}
ret = userfunc(sess, command, serviceid, ip, cookie);
}
- /*
- * XXX: Is there a leak here? Where does IP get freed?
- */
+ free(ip);
aim_freetlvchain(&tlvlist);
return ret;