struct aim_conn_t *conn,
int changetype, char *denylist)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
+ int packlen = 0;
u_short subtype;
char *localcpy = NULL;
if (!denylist)
return 0;
- newpacket.lock = 1;
-
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
-
- newpacket.type = 0x02;
-
localcpy = (char *) malloc(strlen(denylist)+1);
memcpy(localcpy, denylist, strlen(denylist)+1);
listcount = aimutil_itemcnt(localcpy, '&');
- newpacket.commandlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
+ packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
+ if (!(newpacket = aim_tx_new(0x0002, conn, packlen)))
+ return -1;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- memset(newpacket.data, 0x00, newpacket.commandlen);
+ newpacket->lock = 1;
switch(changetype)
{
case AIM_VISIBILITYCHANGE_DENYADD: subtype = 0x07; break;
case AIM_VISIBILITYCHANGE_DENYREMOVE: subtype = 0x08; break;
default:
- free(newpacket.data);
+ free(newpacket->data);
+ free(newpacket);
return 0;
}
/* We actually DO NOT send a SNAC ID with this one! */
- aim_putsnac(newpacket.data, 0x0009, subtype, 0x00, 0);
+ aim_putsnac(newpacket->data, 0x0009, subtype, 0x00, 0);
j = 10; /* the next byte */
{
tmpptr = aimutil_itemidx(localcpy, i, '&');
- newpacket.data[j] = strlen(tmpptr);
- memcpy(&(newpacket.data[j+1]), tmpptr, strlen(tmpptr));
+ newpacket->data[j] = strlen(tmpptr);
+ memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
j += strlen(tmpptr)+1;
free(tmpptr);
}
free(localcpy);
- newpacket.lock = 0;
+ newpacket->lock = 0;
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid); /* dont increment */
*
* buddy_list = "Screen Name One&ScreenNameTwo&";
*
- * TODO: Clean this up.
+ * TODO: Clean this up.
+ *
+ * XXX: I can't stress the TODO enough.
*
*/
u_long aim_bos_setbuddylist(struct aim_session_t *sess,
{
int i, j;
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
int packet_login_phase3c_hi_b_len = 0;
packet_login_phase3c_hi_b_len = 16; /* 16b for FLAP and SNAC headers */
/* bail out if we can't make the packet */
- if (buddy_list == NULL)
- {
- printf("\nNO BUDDIES! ARE YOU THAT LONELY???\n");
- return 0;
- }
-#if debug > 0
- printf("****buddy list: %s\n", buddy_list);
- printf("****buddy list len: %d (%x)\n", strlen(buddy_list), strlen(buddy_list));
-#endif
+ if (!buddy_list) {
+ return -1;
+ }
localcpy = (char *) malloc(strlen(buddy_list)+1);
memcpy(localcpy, buddy_list, strlen(buddy_list)+1);
#endif
free(localcpy);
- newpacket.type = 0x02;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.commandlen = packet_login_phase3c_hi_b_len - 6;
- newpacket.lock = 1;
-
- newpacket.data = (char *) malloc(newpacket.commandlen);
+ if (!(newpacket = aim_tx_new(0x0002, conn, packet_login_phase3c_hi_b_len - 6)))
+ return -1;
- aim_putsnac(newpacket.data, 0x0003, 0x0004, 0x0000, sess->snac_nextid);
+ newpacket->lock = 1;
+
+ aim_putsnac(newpacket->data, 0x0003, 0x0004, 0x0000, sess->snac_nextid);
j = 10; /* the next byte */
#if debug > 0
printf("---adding %s (%d)\n", tmpptr, strlen(tmpptr));
#endif
- newpacket.data[j] = strlen(tmpptr);
- memcpy(&(newpacket.data[j+1]), tmpptr, strlen(tmpptr));
+ newpacket->data[j] = strlen(tmpptr);
+ memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
j += strlen(tmpptr)+1;
i++;
tmpptr = strtok(NULL, "&");
}
- newpacket.lock = 0;
+ newpacket->lock = 0;
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
*/
u_long aim_bos_setprofile(struct aim_session_t *sess,
struct aim_conn_t *conn,
- char *profile)
+ char *profile,
+ char *awaymsg,
+ unsigned int caps)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
int i = 0;
- u_char funkydata[] = {
- 0x09, 0x46, 0x13, 0x46, 0x4c, 0x7f, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,
- 0x09, 0x46, 0x13, 0x41, 0x4c, 0x7f, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,
-
- 0x09, 0x46, 0x13, 0x45, 0x4c, 0x7f, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,
- 0x74, 0x8f, 0x24, 0x20, 0x62, 0x87, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,
-
- 0x09, 0x46, 0x13, 0x48, 0x4c, 0x7f, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,
- 0x09, 0x46, 0x13, 0x43, 0x4c, 0x7f, 0x11, 0xd1,
- 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00
- };
- newpacket.type = 0x02;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
-
- newpacket.commandlen = 1152+strlen(profile)+1; /*arbitrarily large */
- newpacket.data = (char *) malloc(newpacket.commandlen);
+ if (!(newpacket = aim_tx_new(0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0))))
+ return -1;
- i += aim_putsnac(newpacket.data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
- i += aim_puttlv_str(newpacket.data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
- i += aim_puttlv_str(newpacket.data+i, 0x0002, strlen(profile), profile);
+ i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
+ i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
+ i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile);
/* why do we send this twice? */
- i += aim_puttlv_str(newpacket.data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
+ i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
- /* a blank TLV 0x0004 --- not sure what this is either */
- i += aimutil_put16(newpacket.data+i, 0x0004);
- i += aimutil_put16(newpacket.data+i, 0x0000);
+ /* Away message -- we send this no matter what, even if its blank */
+ if (awaymsg)
+ i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg);
+ else
+ i += aim_puttlv_str(newpacket->data+i, 0x0004, 0x0000, NULL);
/* Capability information. */
- i += aim_puttlv_str(newpacket.data+i, 0x0005, 0x0060, funkydata);
-
- newpacket.commandlen = i;
- aim_tx_enqueue(sess, &newpacket);
+ {
+ int isave;
+ i += aimutil_put16(newpacket->data+i, 0x0005);
+ isave = i;
+ i += aimutil_put16(newpacket->data+i, 0);
+ if (caps & AIM_CAPS_BUDDYICON)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[0], 0x10);
+ if (caps & AIM_CAPS_VOICE)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[1], 0x10);
+ if (caps & AIM_CAPS_IMIMAGE)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[2], 0x10);
+ if (caps & AIM_CAPS_CHAT)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[3], 0x10);
+ if (caps & AIM_CAPS_GETFILE)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[4], 0x10);
+ if (caps & AIM_CAPS_SENDFILE)
+ i += aimutil_putstr(newpacket->data+i, aim_caps[5], 0x10);
+ aimutil_put16(newpacket->data+isave, i-isave-2);
+ }
+ newpacket->commandlen = i;
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
0x00, 0x01
};
int command_2_len = 0x52;
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
- newpacket.lock = 1;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.type = 0x02;
- newpacket.commandlen = command_2_len;
- newpacket.data = (char *) malloc (newpacket.commandlen);
- memcpy(newpacket.data, command_2, newpacket.commandlen);
+ if (!(newpacket = aim_tx_new(0x0002, conn, command_2_len)))
+ return -1;
+
+ newpacket->lock = 1;
+
+ memcpy(newpacket->data, command_2, command_2_len);
/* This write over the dynamic parts of the byte block */
- aim_putsnac(newpacket.data, 0x0001, 0x0002, 0x0000, sess->snac_nextid);
+ aim_putsnac(newpacket->data, 0x0001, 0x0002, 0x0000, sess->snac_nextid);
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
u_long aim_bos_ackrateresp(struct aim_session_t *sess,
struct aim_conn_t *conn)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
+ int packlen = 18, i=0;
- newpacket.lock = 1;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.type = 0x02;
- newpacket.commandlen = 18;
+ if (conn->type != AIM_CONN_TYPE_BOS)
+ packlen += 2;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- aim_putsnac(newpacket.data, 0x0001, 0x0008, 0x0000, sess->snac_nextid);
+ if(!(newpacket = aim_tx_new(0x0002, conn, packlen)));
+
+ newpacket->lock = 1;
- newpacket.data[10] = 0x00;
- newpacket.data[11] = 0x01;
- newpacket.data[12] = 0x00;
- newpacket.data[13] = 0x02;
- newpacket.data[14] = 0x00;
- newpacket.data[15] = 0x03;
- newpacket.data[16] = 0x00;
- newpacket.data[17] = 0x04;
+ i = aim_putsnac(newpacket->data, 0x0001, 0x0008, 0x0000, sess->snac_nextid);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0002);
+ i += aimutil_put16(newpacket->data+i, 0x0003);
+ i += aimutil_put16(newpacket->data+i, 0x0004);
+
+ if (conn->type != AIM_CONN_TYPE_BOS) {
+ i += aimutil_put16(newpacket->data+i, 0x0005);
+ }
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
u_long aim_bos_reqpersonalinfo(struct aim_session_t *sess,
struct aim_conn_t *conn)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
- newpacket.lock = 1;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.type = 0x02;
- newpacket.commandlen = 12;
+ if (!(newpacket = aim_tx_new(0x0002, conn, 12)))
+ return -1;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- aim_putsnac(newpacket.data, 0x000a, 0x0001, 0x000e /* huh? */, sess->snac_nextid);
+ newpacket->lock = 1;
+
+ aim_putsnac(newpacket->data, 0x000a, 0x0001, 0x000e /* huh? */, sess->snac_nextid);
- newpacket.data[10] = 0x0d;
- newpacket.data[11] = 0xda;
+ newpacket->data[10] = 0x0d;
+ newpacket->data[11] = 0xda;
- newpacket.lock = 0;
- aim_tx_enqueue(sess, &newpacket);
+ newpacket->lock = 0;
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
u_long aim_setversions(struct aim_session_t *sess,
struct aim_conn_t *conn)
{
- struct command_tx_struct newpacket;
- int i,j;
+ struct command_tx_struct *newpacket;
+ int i;
- newpacket.lock = 1;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.type = 0x02;
- newpacket.commandlen = 10 + (4*11);
+ if (!(newpacket = aim_tx_new(0x0002, conn, 10 + (4*11))))
+ return -1;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- i = aim_putsnac(newpacket.data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
+ newpacket->lock = 1;
- i += aimutil_put16(newpacket.data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x0003);
+ i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
- i += aimutil_put16(newpacket.data+i, 0x0002);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0003);
- i += aimutil_put16(newpacket.data+i, 0x0003);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0002);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x0004);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0003);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x0006);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0004);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x0008);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0006);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x0009);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0008);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x000a);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x0009);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x000b);
- i += aimutil_put16(newpacket.data+i, 0x0002);
+ i += aimutil_put16(newpacket->data+i, 0x000a);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket.data+i, 0x000c);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x000b);
+ i += aimutil_put16(newpacket->data+i, 0x0002);
- i += aimutil_put16(newpacket.data+i, 0x0015);
- i += aimutil_put16(newpacket.data+i, 0x0001);
+ i += aimutil_put16(newpacket->data+i, 0x000c);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
+
+ i += aimutil_put16(newpacket->data+i, 0x0015);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
#if 0
- for (j = 0; j < 0x10; j++)
-A
- {
- i += aimutil_put16(newpacket.data+i, j); /* family */
- i += aimutil_put16(newpacket.data+i, 0x0003); /* version */
- }
+ for (j = 0; j < 0x10; j++) {
+ i += aimutil_put16(newpacket->data+i, j); /* family */
+ i += aimutil_put16(newpacket->data+i, 0x0003); /* version */
+ }
#endif
- newpacket.lock = 0;
- aim_tx_enqueue(sess, &newpacket);
+ newpacket->lock = 0;
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
struct aim_conn_t *conn,
u_short family, u_short subtype)
{
- struct command_tx_struct newpacket;
-
- newpacket.lock = 1;
-
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
- newpacket.type = 0x02;
+ struct command_tx_struct *newpacket;
- newpacket.commandlen = 10;
+ if (!(newpacket = aim_tx_new(0x0002, conn, 10)))
+ return 0;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- memset(newpacket.data, 0x00, newpacket.commandlen);
+ newpacket->lock = 1;
- aim_putsnac(newpacket.data, family, subtype, 0x0000, sess->snac_nextid);
+ aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
struct aim_conn_t *conn,
u_short family, u_short subtype, u_long *longdata)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
u_long newlong;
/* If we don't have data, there's no reason to use this function */
if (!longdata)
return aim_genericreq_n(sess, conn, family, subtype);
- newpacket.lock = 1;
-
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
-
- newpacket.type = 0x02;
-
- newpacket.commandlen = 10+sizeof(u_long);
+ if (!(newpacket = aim_tx_new(0x0002, conn, 10+sizeof(u_long))))
+ return -1;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- memset(newpacket.data, 0x00, newpacket.commandlen);
+ newpacket->lock = 1;
- aim_putsnac(newpacket.data, family, subtype, 0x0000, sess->snac_nextid);
+ aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
/* copy in data */
newlong = htonl(*longdata);
- memcpy(&(newpacket.data[10]), &newlong, sizeof(u_long));
+ memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long));
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
struct aim_conn_t *conn,
u_short family, u_short subtype, u_short *shortdata)
{
- struct command_tx_struct newpacket;
+ struct command_tx_struct *newpacket;
u_short newshort;
/* If we don't have data, there's no reason to use this function */
if (!shortdata)
return aim_genericreq_n(sess, conn, family, subtype);
- newpacket.lock = 1;
+ if (!(newpacket = aim_tx_new(0x0002, conn, 10+sizeof(u_short))))
+ return -1;
- if (conn)
- newpacket.conn = conn;
- else
- newpacket.conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
-
- newpacket.type = 0x02;
-
- newpacket.commandlen = 10+sizeof(u_short);
+ newpacket->lock = 1;
- newpacket.data = (char *) malloc(newpacket.commandlen);
- memset(newpacket.data, 0x00, newpacket.commandlen);
-
- aim_putsnac(newpacket.data, family, subtype, 0x0000, sess->snac_nextid);
+ aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
/* copy in data */
newshort = htons(*shortdata);
- memcpy(&(newpacket.data[10]), &newshort, sizeof(u_short));
+ memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short));
- aim_tx_enqueue(sess, &newpacket);
+ aim_tx_enqueue(sess, newpacket);
return (sess->snac_nextid++);
}
}
/*
- * aim_bos_reqicbmparaminfo()
+* aim_bos_reqicbmparaminfo()
*
* Request ICBM parameter information.
*
{
return aim_genericreq_n(sess, conn, 0x0004, 0x0004);
}
+