]> andersk Git - libfaim.git/blame - aim_misc.c
- Tue Aug 8 04:15:47 UTC 2000
[libfaim.git] / aim_misc.c
CommitLineData
9de3ca7e 1
2/*
3 * aim_misc.c
4 *
5 * TODO: Seperate a lot of this into an aim_bos.c.
6 *
7 * Other things...
8 *
9 * - Idle setting
10 *
11 *
12 */
13
a25832e6 14#include <faim/aim.h>
9de3ca7e 15
16/*
17 * aim_bos_setidle()
18 *
19 * Should set your current idle time in seconds. Idealy, OSCAR should
20 * do this for us. But, it doesn't. The client must call this to set idle
21 * time.
22 *
23 */
a25832e6 24u_long aim_bos_setidle(struct aim_session_t *sess,
25 struct aim_conn_t *conn,
26 u_long idletime)
9de3ca7e 27{
a25832e6 28 return aim_genericreq_l(sess, conn, 0x0001, 0x0011, &idletime);
9de3ca7e 29}
30
31
32/*
33 * aim_bos_changevisibility(conn, changtype, namelist)
34 *
35 * Changes your visibility depending on changetype:
36 *
37 * AIM_VISIBILITYCHANGE_PERMITADD: Lets provided list of names see you
38 * AIM_VISIBILITYCHANGE_PERMIDREMOVE: Removes listed names from permit list
39 * AIM_VISIBILITYCHANGE_DENYADD: Hides you from provided list of names
40 * AIM_VISIBILITYCHANGE_DENYREMOVE: Lets list see you again
41 *
42 * list should be a list of
43 * screen names in the form "Screen Name One&ScreenNameTwo&" etc.
44 *
45 * Equivelents to options in WinAIM:
46 * - Allow all users to contact me: Send an AIM_VISIBILITYCHANGE_DENYADD
47 * with only your name on it.
48 * - Allow only users on my Buddy List: Send an
49 * AIM_VISIBILITYCHANGE_PERMITADD with the list the same as your
50 * buddy list
51 * - Allow only the uesrs below: Send an AIM_VISIBILITYCHANGE_PERMITADD
52 * with everyone listed that you want to see you.
53 * - Block all users: Send an AIM_VISIBILITYCHANGE_PERMITADD with only
54 * yourself in the list
55 * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with
56 * the list of users to be blocked
57 *
58 *
59 */
a25832e6 60u_long aim_bos_changevisibility(struct aim_session_t *sess,
61 struct aim_conn_t *conn,
62 int changetype, char *denylist)
9de3ca7e 63{
5b79dc93 64 struct command_tx_struct *newpacket;
65 int packlen = 0;
9de3ca7e 66 u_short subtype;
67
68 char *localcpy = NULL;
69 char *tmpptr = NULL;
70 int i,j;
71 int listcount;
72
73 if (!denylist)
74 return 0;
75
9de3ca7e 76 localcpy = (char *) malloc(strlen(denylist)+1);
77 memcpy(localcpy, denylist, strlen(denylist)+1);
78
79 listcount = aimutil_itemcnt(localcpy, '&');
5b79dc93 80 packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
9de3ca7e 81
b69540e3 82 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen)))
5b79dc93 83 return -1;
9de3ca7e 84
5b79dc93 85 newpacket->lock = 1;
9de3ca7e 86
87 switch(changetype)
88 {
89 case AIM_VISIBILITYCHANGE_PERMITADD: subtype = 0x05; break;
90 case AIM_VISIBILITYCHANGE_PERMITREMOVE: subtype = 0x06; break;
91 case AIM_VISIBILITYCHANGE_DENYADD: subtype = 0x07; break;
92 case AIM_VISIBILITYCHANGE_DENYREMOVE: subtype = 0x08; break;
93 default:
5b79dc93 94 free(newpacket->data);
95 free(newpacket);
9de3ca7e 96 return 0;
97 }
98
99 /* We actually DO NOT send a SNAC ID with this one! */
5b79dc93 100 aim_putsnac(newpacket->data, 0x0009, subtype, 0x00, 0);
9de3ca7e 101
102 j = 10; /* the next byte */
103
104 for (i=0; (i < (listcount - 1)) && (i < 99); i++)
105 {
106 tmpptr = aimutil_itemidx(localcpy, i, '&');
107
5b79dc93 108 newpacket->data[j] = strlen(tmpptr);
109 memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
9de3ca7e 110 j += strlen(tmpptr)+1;
111 free(tmpptr);
112 }
113 free(localcpy);
114
5b79dc93 115 newpacket->lock = 0;
9de3ca7e 116
5b79dc93 117 aim_tx_enqueue(sess, newpacket);
9de3ca7e 118
a25832e6 119 return (sess->snac_nextid); /* dont increment */
9de3ca7e 120
121}
122
123
124
125/*
126 * aim_bos_setbuddylist(buddylist)
127 *
128 * This just builds the "set buddy list" command then queues it.
129 *
130 * buddy_list = "Screen Name One&ScreenNameTwo&";
131 *
5b79dc93 132 * TODO: Clean this up.
133 *
134 * XXX: I can't stress the TODO enough.
9de3ca7e 135 *
136 */
a25832e6 137u_long aim_bos_setbuddylist(struct aim_session_t *sess,
138 struct aim_conn_t *conn,
139 char *buddy_list)
9de3ca7e 140{
141 int i, j;
142
5b79dc93 143 struct command_tx_struct *newpacket;
9de3ca7e 144
145 int packet_login_phase3c_hi_b_len = 0;
146
147 char *localcpy = NULL;
148 char *tmpptr = NULL;
149
150 packet_login_phase3c_hi_b_len = 16; /* 16b for FLAP and SNAC headers */
151
152 /* bail out if we can't make the packet */
5b79dc93 153 if (!buddy_list) {
154 return -1;
155 }
9de3ca7e 156
157 localcpy = (char *) malloc(strlen(buddy_list)+1);
158 memcpy(localcpy, buddy_list, strlen(buddy_list)+1);
159
160 i = 0;
161 tmpptr = strtok(localcpy, "&");
162 while ((tmpptr != NULL) && (i < 100))
163 {
164#if debug > 0
165 printf("---adding %s (%d)\n", tmpptr, strlen(tmpptr));
166#endif
167 packet_login_phase3c_hi_b_len += strlen(tmpptr)+1;
168 i++;
169 tmpptr = strtok(NULL, "&");
170 }
171#if debug > 0
172 printf("*** send buddy list len: %d (%x)\n", packet_login_phase3c_hi_b_len, packet_login_phase3c_hi_b_len);
173#endif
174 free(localcpy);
175
b69540e3 176 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packet_login_phase3c_hi_b_len - 6)))
5b79dc93 177 return -1;
9de3ca7e 178
5b79dc93 179 newpacket->lock = 1;
180
181 aim_putsnac(newpacket->data, 0x0003, 0x0004, 0x0000, sess->snac_nextid);
9de3ca7e 182
183 j = 10; /* the next byte */
184
185 i = 0;
186 tmpptr = strtok(buddy_list, "&");
187 while ((tmpptr != NULL) & (i < 100))
188 {
189#if debug > 0
190 printf("---adding %s (%d)\n", tmpptr, strlen(tmpptr));
191#endif
5b79dc93 192 newpacket->data[j] = strlen(tmpptr);
193 memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
9de3ca7e 194 j += strlen(tmpptr)+1;
195 i++;
196 tmpptr = strtok(NULL, "&");
197 }
198
5b79dc93 199 newpacket->lock = 0;
9de3ca7e 200
5b79dc93 201 aim_tx_enqueue(sess, newpacket);
9de3ca7e 202
a25832e6 203 return (sess->snac_nextid++);
9de3ca7e 204}
205
206/*
207 * aim_bos_setprofile(profile)
208 *
209 * Gives BOS your profile.
210 *
26af6789 211 *
9de3ca7e 212 */
a25832e6 213u_long aim_bos_setprofile(struct aim_session_t *sess,
214 struct aim_conn_t *conn,
0c20631f 215 char *profile,
5b79dc93 216 char *awaymsg,
217 unsigned int caps)
9de3ca7e 218{
5b79dc93 219 struct command_tx_struct *newpacket;
b69540e3 220 int i = 0, tmp, caplen;
0c20631f 221
b69540e3 222 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0))))
5b79dc93 223 return -1;
9de3ca7e 224
5b79dc93 225 i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
226 i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
227 i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile);
26af6789 228 /* why do we send this twice? */
5b79dc93 229 i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
9de3ca7e 230
0c20631f 231 /* Away message -- we send this no matter what, even if its blank */
232 if (awaymsg)
5b79dc93 233 i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg);
0c20631f 234 else
5b79dc93 235 i += aim_puttlv_str(newpacket->data+i, 0x0004, 0x0000, NULL);
26af6789 236
237 /* Capability information. */
b69540e3 238
239 tmp = (i += aimutil_put16(newpacket->data+i, 0x0005));
240 i += aimutil_put16(newpacket->data+i, 0x0000); /* rewritten later */
241 i += (caplen = aim_putcap(newpacket->data+i, 512, caps));
242 aimutil_put16(newpacket->data+tmp, caplen); /* rewrite TLV size */
243
5b79dc93 244 newpacket->commandlen = i;
245 aim_tx_enqueue(sess, newpacket);
9de3ca7e 246
a25832e6 247 return (sess->snac_nextid++);
9de3ca7e 248}
249
250/*
251 * aim_bos_setgroupperm(mask)
252 *
253 * Set group permisson mask. Normally 0x1f.
254 *
255 */
a25832e6 256u_long aim_bos_setgroupperm(struct aim_session_t *sess,
257 struct aim_conn_t *conn,
258 u_long mask)
9de3ca7e 259{
a25832e6 260 return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask);
9de3ca7e 261}
262
263/*
264 * aim_bos_clientready()
265 *
266 * Send Client Ready.
267 *
268 * TODO: Dynamisize.
269 *
270 */
a25832e6 271u_long aim_bos_clientready(struct aim_session_t *sess,
272 struct aim_conn_t *conn)
9de3ca7e 273{
274 u_char command_2[] = {
275 /* placeholders for dynamic data */
276 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
277 0xff, 0xff,
278 /* real data */
01b59e1e 279 0x00, 0x01,
280 0x00, 0x03,
281 0x00, 0x04,
282 0x06, 0x86,
283 0x00, 0x02,
284 0x00, 0x01,
285 0x00, 0x04,
286 0x00, 0x01,
287
288 0x00, 0x03,
289 0x00, 0x01,
290 0x00, 0x04,
291 0x00, 0x01,
292 0x00, 0x04,
293 0x00, 0x01,
294 0x00, 0x04,
295 0x00, 0x01,
296
297 0x00, 0x06,
298 0x00, 0x01,
299 0x00, 0x04,
300 0x00, 0x01,
301 0x00, 0x08,
302 0x00, 0x01,
303 0x00, 0x04,
304 0x00, 0x01,
305
306 0x00, 0x09,
307 0x00, 0x01,
308 0x00, 0x04,
309 0x00, 0x01,
310 0x00, 0x0a,
311 0x00, 0x01,
312 0x00, 0x04,
313 0x00, 0x01,
314
315 0x00, 0x0b,
316 0x00, 0x01,
317 0x00, 0x04,
9de3ca7e 318 0x00, 0x01
319 };
320 int command_2_len = 0x52;
5b79dc93 321 struct command_tx_struct *newpacket;
9de3ca7e 322
b69540e3 323 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, command_2_len)))
5b79dc93 324 return -1;
325
326 newpacket->lock = 1;
327
328 memcpy(newpacket->data, command_2, command_2_len);
9de3ca7e 329
330 /* This write over the dynamic parts of the byte block */
5b79dc93 331 aim_putsnac(newpacket->data, 0x0001, 0x0002, 0x0000, sess->snac_nextid);
9de3ca7e 332
5b79dc93 333 aim_tx_enqueue(sess, newpacket);
9de3ca7e 334
a25832e6 335 return (sess->snac_nextid++);
9de3ca7e 336}
337
338/*
339 * send_login_phase3(int socket)
340 *
341 * Request Rate Information.
342 *
343 * TODO: Move to aim_conn.
344 * TODO: Move to SNAC interface.
345 */
a25832e6 346u_long aim_bos_reqrate(struct aim_session_t *sess,
347 struct aim_conn_t *conn)
9de3ca7e 348{
a25832e6 349 return aim_genericreq_n(sess, conn, 0x0001, 0x0006);
9de3ca7e 350}
351
352/*
353 * send_login_phase3b(int socket)
354 *
355 * Rate Information Response Acknowledge.
356 *
357 */
a25832e6 358u_long aim_bos_ackrateresp(struct aim_session_t *sess,
359 struct aim_conn_t *conn)
9de3ca7e 360{
5b79dc93 361 struct command_tx_struct *newpacket;
362 int packlen = 18, i=0;
9de3ca7e 363
0c20631f 364 if (conn->type != AIM_CONN_TYPE_BOS)
5b79dc93 365 packlen += 2;
366
b69540e3 367 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen)));
5b79dc93 368
369 newpacket->lock = 1;
9de3ca7e 370
5b79dc93 371 i = aim_putsnac(newpacket->data, 0x0001, 0x0008, 0x0000, sess->snac_nextid);
372 i += aimutil_put16(newpacket->data+i, 0x0001);
373 i += aimutil_put16(newpacket->data+i, 0x0002);
374 i += aimutil_put16(newpacket->data+i, 0x0003);
375 i += aimutil_put16(newpacket->data+i, 0x0004);
376
377 if (conn->type != AIM_CONN_TYPE_BOS) {
378 i += aimutil_put16(newpacket->data+i, 0x0005);
379 }
380
381 aim_tx_enqueue(sess, newpacket);
9de3ca7e 382
a25832e6 383 return (sess->snac_nextid++);
9de3ca7e 384}
385
386/*
387 * aim_bos_setprivacyflags()
388 *
389 * Sets privacy flags. Normally 0x03.
390 *
391 * Bit 1: Allows other AIM users to see how long you've been idle.
392 *
393 *
394 */
a25832e6 395u_long aim_bos_setprivacyflags(struct aim_session_t *sess,
396 struct aim_conn_t *conn,
397 u_long flags)
9de3ca7e 398{
a25832e6 399 return aim_genericreq_l(sess, conn, 0x0001, 0x0014, &flags);
9de3ca7e 400}
401
402/*
403 * aim_bos_reqpersonalinfo()
404 *
405 * Requests the current user's information. Can't go generic on this one
406 * because aparently it uses SNAC flags.
407 *
408 */
a25832e6 409u_long aim_bos_reqpersonalinfo(struct aim_session_t *sess,
410 struct aim_conn_t *conn)
9de3ca7e 411{
5b79dc93 412 struct command_tx_struct *newpacket;
9de3ca7e 413
b69540e3 414 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 12)))
5b79dc93 415 return -1;
9de3ca7e 416
5b79dc93 417 newpacket->lock = 1;
418
419 aim_putsnac(newpacket->data, 0x000a, 0x0001, 0x000e /* huh? */, sess->snac_nextid);
9de3ca7e 420
5b79dc93 421 newpacket->data[10] = 0x0d;
422 newpacket->data[11] = 0xda;
9de3ca7e 423
5b79dc93 424 newpacket->lock = 0;
425 aim_tx_enqueue(sess, newpacket);
9de3ca7e 426
a25832e6 427 return (sess->snac_nextid++);
9de3ca7e 428}
429
01b59e1e 430u_long aim_setversions(struct aim_session_t *sess,
431 struct aim_conn_t *conn)
432{
5b79dc93 433 struct command_tx_struct *newpacket;
0c20631f 434 int i;
01b59e1e 435
b69540e3 436 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + (4*11))))
5b79dc93 437 return -1;
438
439 newpacket->lock = 1;
01b59e1e 440
5b79dc93 441 i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
01b59e1e 442
5b79dc93 443 i += aimutil_put16(newpacket->data+i, 0x0001);
444 i += aimutil_put16(newpacket->data+i, 0x0003);
26af6789 445
5b79dc93 446 i += aimutil_put16(newpacket->data+i, 0x0002);
447 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 448
5b79dc93 449 i += aimutil_put16(newpacket->data+i, 0x0003);
450 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 451
5b79dc93 452 i += aimutil_put16(newpacket->data+i, 0x0004);
453 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 454
5b79dc93 455 i += aimutil_put16(newpacket->data+i, 0x0006);
456 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 457
5b79dc93 458 i += aimutil_put16(newpacket->data+i, 0x0008);
459 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 460
5b79dc93 461 i += aimutil_put16(newpacket->data+i, 0x0009);
462 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 463
5b79dc93 464 i += aimutil_put16(newpacket->data+i, 0x000a);
465 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 466
5b79dc93 467 i += aimutil_put16(newpacket->data+i, 0x000b);
468 i += aimutil_put16(newpacket->data+i, 0x0002);
26af6789 469
5b79dc93 470 i += aimutil_put16(newpacket->data+i, 0x000c);
471 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 472
5b79dc93 473 i += aimutil_put16(newpacket->data+i, 0x0015);
474 i += aimutil_put16(newpacket->data+i, 0x0001);
01b59e1e 475
476#if 0
5b79dc93 477 for (j = 0; j < 0x10; j++) {
478 i += aimutil_put16(newpacket->data+i, j); /* family */
479 i += aimutil_put16(newpacket->data+i, 0x0003); /* version */
480 }
01b59e1e 481#endif
5b79dc93 482 newpacket->lock = 0;
483 aim_tx_enqueue(sess, newpacket);
01b59e1e 484
485 return (sess->snac_nextid++);
486}
487
488
9de3ca7e 489/*
490 * aim_bos_reqservice(serviceid)
491 *
492 * Service request.
493 *
494 */
a25832e6 495u_long aim_bos_reqservice(struct aim_session_t *sess,
496 struct aim_conn_t *conn,
497 u_short serviceid)
9de3ca7e 498{
a25832e6 499 return aim_genericreq_s(sess, conn, 0x0001, 0x0004, &serviceid);
9de3ca7e 500}
501
f0a7908e 502/*
503 * aim_bos_nop()
504 *
505 * No-op. WinAIM sends these every 4min or so to keep
506 * the connection alive. With the recent changes
507 * in the OSCAR servers, it looks like we must do the
508 * same or be disconnected with a mysterious 'you logged
509 * on from another client' message.
510 *
511 */
512u_long aim_bos_nop(struct aim_session_t *sess,
513 struct aim_conn_t *conn)
514{
515 return aim_genericreq_n(sess, conn, 0x0001, 0x0016);
516}
517
9de3ca7e 518/*
519 * aim_bos_reqrights()
520 *
521 * Request BOS rights.
522 *
523 */
a25832e6 524u_long aim_bos_reqrights(struct aim_session_t *sess,
525 struct aim_conn_t *conn)
9de3ca7e 526{
a25832e6 527 return aim_genericreq_n(sess, conn, 0x0009, 0x0002);
9de3ca7e 528}
529
530/*
531 * aim_bos_reqbuddyrights()
532 *
533 * Request Buddy List rights.
534 *
535 */
a25832e6 536u_long aim_bos_reqbuddyrights(struct aim_session_t *sess,
537 struct aim_conn_t *conn)
9de3ca7e 538{
a25832e6 539 return aim_genericreq_n(sess, conn, 0x0003, 0x0002);
9de3ca7e 540}
541
e5012450 542/*
543 * aim_debugconn_sendconnect()
544 *
545 * For aimdebugd. If you don't know what it is, you don't want to.
546 */
547u_long aim_debugconn_sendconnect(struct aim_session_t *sess,
548 struct aim_conn_t *conn)
549{
550 return aim_genericreq_n(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT);
551}
552
9de3ca7e 553/*
554 * Generic routine for sending commands.
555 *
556 *
557 * I know I can do this in a smarter way...but I'm not thinking straight
558 * right now...
559 *
560 * I had one big function that handled all three cases, but then it broke
561 * and I split it up into three. But then I fixed it. I just never went
562 * back to the single. I don't see any advantage to doing it either way.
563 *
564 */
a25832e6 565u_long aim_genericreq_n(struct aim_session_t *sess,
566 struct aim_conn_t *conn,
567 u_short family, u_short subtype)
9de3ca7e 568{
5b79dc93 569 struct command_tx_struct *newpacket;
9de3ca7e 570
b69540e3 571 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10)))
5b79dc93 572 return 0;
9de3ca7e 573
5b79dc93 574 newpacket->lock = 1;
9de3ca7e 575
5b79dc93 576 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 577
5b79dc93 578 aim_tx_enqueue(sess, newpacket);
a25832e6 579 return (sess->snac_nextid++);
9de3ca7e 580}
581
582/*
583 *
584 *
585 */
a25832e6 586u_long aim_genericreq_l(struct aim_session_t *sess,
587 struct aim_conn_t *conn,
588 u_short family, u_short subtype, u_long *longdata)
9de3ca7e 589{
5b79dc93 590 struct command_tx_struct *newpacket;
9de3ca7e 591 u_long newlong;
592
593 /* If we don't have data, there's no reason to use this function */
594 if (!longdata)
a25832e6 595 return aim_genericreq_n(sess, conn, family, subtype);
9de3ca7e 596
b69540e3 597 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_long))))
5b79dc93 598 return -1;
9de3ca7e 599
5b79dc93 600 newpacket->lock = 1;
9de3ca7e 601
5b79dc93 602 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 603
604 /* copy in data */
605 newlong = htonl(*longdata);
5b79dc93 606 memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long));
9de3ca7e 607
5b79dc93 608 aim_tx_enqueue(sess, newpacket);
a25832e6 609 return (sess->snac_nextid++);
9de3ca7e 610}
611
a25832e6 612u_long aim_genericreq_s(struct aim_session_t *sess,
613 struct aim_conn_t *conn,
614 u_short family, u_short subtype, u_short *shortdata)
9de3ca7e 615{
5b79dc93 616 struct command_tx_struct *newpacket;
9de3ca7e 617 u_short newshort;
618
619 /* If we don't have data, there's no reason to use this function */
620 if (!shortdata)
a25832e6 621 return aim_genericreq_n(sess, conn, family, subtype);
9de3ca7e 622
b69540e3 623 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_short))))
5b79dc93 624 return -1;
9de3ca7e 625
5b79dc93 626 newpacket->lock = 1;
9de3ca7e 627
5b79dc93 628 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 629
630 /* copy in data */
631 newshort = htons(*shortdata);
5b79dc93 632 memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short));
9de3ca7e 633
5b79dc93 634 aim_tx_enqueue(sess, newpacket);
a25832e6 635 return (sess->snac_nextid++);
9de3ca7e 636}
637
638/*
639 * aim_bos_reqlocaterights()
640 *
641 * Request Location services rights.
642 *
643 */
a25832e6 644u_long aim_bos_reqlocaterights(struct aim_session_t *sess,
645 struct aim_conn_t *conn)
9de3ca7e 646{
a25832e6 647 return aim_genericreq_n(sess, conn, 0x0002, 0x0002);
9de3ca7e 648}
649
650/*
e88ba395 651* aim_bos_reqicbmparaminfo()
9de3ca7e 652 *
653 * Request ICBM parameter information.
654 *
655 */
a25832e6 656u_long aim_bos_reqicbmparaminfo(struct aim_session_t *sess,
657 struct aim_conn_t *conn)
9de3ca7e 658{
a25832e6 659 return aim_genericreq_n(sess, conn, 0x0004, 0x0004);
9de3ca7e 660}
e88ba395 661
This page took 0.443524 seconds and 5 git commands to generate.