{
rxcallback_t userfunc;
unsigned long offset, len;
- struct aim_tlvlist_t *tlvlist;
- struct aim_tlv_t *tlv;
- char *modname;
+ int i = 0;
+ struct aim_tlvlist_t *list;
+ char *modname = NULL;
offset = aimutil_get32(data);
+ i += 4;
+
len = aimutil_get32(data+4);
+ i += 4;
- if(rx->commandlen > 0x12) { /* XXX right len? */
- tlvlist = aim_readtlvchain(data+8, datalen-8);
+ list = aim_readtlvchain(data+i, datalen-i);
- if((tlv = aim_gettlv(tlvlist, 0x0001, 1))) {
- modname = malloc(tlv->length + 5);
- memset(modname, 0, tlv->length + 5);
- memcpy(modname, tlv->value, tlv->length);
- strncat(modname, ".ocm", tlv->length + 5 - strlen(modname));
- } else {
- modname = "aim.exe";
- }
- } else
- modname = "aim.exe";
-
- faimdprintf(sess, 1, "data at 0x%08lx (%d bytes) of %s requested\n", offset, len, modname);
+ if (aim_gettlv(list, 0x0001, 1))
+ modname = aim_gettlv_str(list, 0x0001, 1);
+
+ faimdprintf(sess, 1, "data at 0x%08lx (%d bytes) of requested\n", offset, len, modname?modname:"aim.exe");
if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
return userfunc(sess, rx, offset, len, modname);
+ free(modname);
+ aim_freetlvchain(&list);
+
return 0;
}
return 1;
}
-static int getaimdata(unsigned char *buf, int buflen, unsigned long offset, char *modname)
+static int getaimdata(unsigned char *buf, int buflen, unsigned long offset, const char *modname)
{
FILE *f;
+ static const char defaultmod[] = "aim.exe";
+ char *filename = NULL;
- char *filename;
- int len;
+ if (modname) {
- len = strlen(aimbinarypath)+1+strlen(modname)+1;
+ if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(modname)+4+1))) {
+ dperror("memrequest: malloc");
+ return -1;
+ }
+
+ sprintf(filename, "%s/%s.ocm", aimbinarypath, modname);
+
+ } else {
+
+ if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(defaultmod)+1))) {
+ dperror("memrequest: malloc");
+ return -1;
+ }
+
+ sprintf(filename, "%s/%s", aimbinarypath, defaultmod);
- if(!(filename = malloc(len))) {
- dperror("memrequest: malloc");
- return -1;
}
- memset(filename,0, len);
- memcpy(filename, aimbinarypath, strlen(aimbinarypath));
- filename[strlen(filename)] = '/';
- strncat(filename, modname, len - strlen(filename));
+ dvprintf("memrequest: loading %d bytes from 0x%08lx in \"%s\"...\n", buflen, offset, filename);
if (!(f = fopen(filename, "r"))) {
dperror("memrequest: fopen");
+ free(filename);
return -1;
}
+ free(filename);
+
if (fseek(f, offset, SEEK_SET) == -1) {
dperror("memrequest: fseek");
fclose(f);
if (aimbinarypath && (getaimdata(buf, len, offset, modname) == len)) {
- dvprintf("memrequest: sending %ld bytes from 0x%08lx in \"%s/%s\"...\n", len, offset, aimbinarypath, modname);
-
aim_sendmemblock(sess, command->conn, offset, len, buf);
} else {