return 1;
}
-static int getaimdata(unsigned char *buf, int buflen, unsigned long offset)
+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;
+
+ memset(buf, 0, buflen);
+
+ if (modname) {
+
+ 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 (!(f = fopen(aimbinarypath, "r"))) {
- dperror("memrequest: fopen");
- return -1;
}
- if (fseek(f, offset, SEEK_SET) == -1) {
- dperror("memrequest: fseek");
- fclose(f);
+ 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;
}
- if (fread(buf, buflen, 1, f) != 1) {
- dperror("memrequest: fread");
- fclose(f);
- return -1;
+ free(filename);
+
+ if (buflen) {
+ if (fseek(f, offset, SEEK_SET) == -1) {
+ dperror("memrequest: fseek");
+ fclose(f);
+ return -1;
+ }
+
+ if (fread(buf, buflen, 1, f) != 1) {
+ dperror("memrequest: fread");
+ fclose(f);
+ return -1;
+ }
}
fclose(f);
va_list ap;
unsigned long offset, len;
unsigned char *buf;
+ char *modname;
va_start(ap, command);
offset = va_arg(ap, unsigned long);
len = va_arg(ap, unsigned long);
+ modname = va_arg(ap, char *);
va_end(ap);
if (!(buf = malloc(len))) {
return 0;
}
- if (aimbinarypath && (getaimdata(buf, len, offset) == len)) {
-
- dvprintf("memrequest: sending %ld bytes from 0x%08lx in %s...\n", len, offset, aimbinarypath);
+ if (aimbinarypath && (getaimdata(buf, len, offset, modname) == len)) {
aim_sendmemblock(sess, command->conn, offset, len, buf);
} else {
- dprintf("memrequest: unable to use AIM binary, sending defaults...\n");
+ dvprintf("memrequest: unable to use AIM binary (\"%s/%s\"), sending defaults...\n", aimbinarypath, modname);
aim_sendmemblock(sess, command->conn, offset, len, NULL);