|
|
@@ -8,7 +8,18 @@
|
|
|
#include "net.h"
|
|
|
#include "misc.h"
|
|
|
|
|
|
-static void link_ghost(int idx, direction_t direction)
|
|
|
+int link_find_by_type(int type)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ for (i = 0; enclink[i].name; i++)
|
|
|
+ if (type == enclink[i].type)
|
|
|
+ return i;
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+static void ghost_link(int idx, direction_t direction)
|
|
|
{
|
|
|
int snum = findanysnum(dcc[idx].sock);
|
|
|
|
|
|
@@ -71,20 +82,123 @@ static void link_ghost(int idx, direction_t direction)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void enclink_call(int idx, int type, direction_t direction)
|
|
|
+static int
|
|
|
+prand(int *seed, int range)
|
|
|
+{
|
|
|
+ long long i1 = *seed;
|
|
|
+
|
|
|
+ i1 = (i1 * 0x08088405 + 1) & 0xFFFFFFFF;
|
|
|
+ *seed = i1;
|
|
|
+ return ((i1 * range) >> 32);
|
|
|
+}
|
|
|
+
|
|
|
+static int ghost_read(int snum, char *src, size_t *len)
|
|
|
+{
|
|
|
+ char *line = decrypt_string(socklist[snum].ikey, src);
|
|
|
+
|
|
|
+ strcpy(src, line);
|
|
|
+ free(line);
|
|
|
+ if (socklist[snum].iseed) {
|
|
|
+ *(dword *) & socklist[snum].ikey[0] = prand(&socklist[snum].iseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].ikey[4] = prand(&socklist[snum].iseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].ikey[8] = prand(&socklist[snum].iseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].ikey[12] = prand(&socklist[snum].iseed, 0xFFFFFFFF);
|
|
|
+
|
|
|
+ if (!socklist[snum].iseed)
|
|
|
+ socklist[snum].iseed++;
|
|
|
+ }
|
|
|
+// *len = strlen(src);
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
+static char *ghost_write(int snum, char *src, size_t *len)
|
|
|
+{
|
|
|
+ char *srcbuf = NULL, *buf = NULL, *line = NULL, *eol = NULL, *eline = NULL;
|
|
|
+ size_t bufpos = 0;
|
|
|
+
|
|
|
+ srcbuf = (char *) my_calloc(1, *len + 9 + 1);
|
|
|
+ strcpy(srcbuf, src);
|
|
|
+ line = srcbuf;
|
|
|
+
|
|
|
+ eol = strchr(line, '\n');
|
|
|
+ while (eol) {
|
|
|
+ *eol++ = 0;
|
|
|
+ eline = encrypt_string(socklist[snum].okey, line);
|
|
|
+ if (socklist[snum].oseed) {
|
|
|
+ *(dword *) & socklist[snum].okey[0] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[4] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[8] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[12] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+
|
|
|
+ if (!socklist[snum].oseed)
|
|
|
+ socklist[snum].oseed++;
|
|
|
+ }
|
|
|
+ buf = (char *) my_realloc(buf, bufpos + strlen(eline) + 1 + 9);
|
|
|
+ strcpy((char *) &buf[bufpos], eline);
|
|
|
+ free(eline);
|
|
|
+ strcat(buf, "\n");
|
|
|
+ bufpos = strlen(buf);
|
|
|
+ line = eol;
|
|
|
+ eol = strchr(line, '\n');
|
|
|
+ }
|
|
|
+ if (line[0]) {
|
|
|
+ eline = encrypt_string(socklist[snum].okey, line);
|
|
|
+ if (socklist[snum].oseed) {
|
|
|
+ *(dword *) & socklist[snum].okey[0] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[4] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[8] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+ *(dword *) & socklist[snum].okey[12] = prand(&socklist[snum].oseed, 0xFFFFFFFF);
|
|
|
+
|
|
|
+ if (!socklist[snum].oseed)
|
|
|
+ socklist[snum].oseed++;
|
|
|
+ }
|
|
|
+ buf = (char *) my_realloc(buf, bufpos + strlen(eline) + 1 + 9);
|
|
|
+ strcpy((char *) &buf[bufpos], eline);
|
|
|
+ free(eline);
|
|
|
+ strcat(buf, "\n");
|
|
|
+ }
|
|
|
+ free(srcbuf);
|
|
|
+
|
|
|
+ *len = strlen(buf);
|
|
|
+ return buf;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void link_link(int idx, int type, direction_t direction)
|
|
|
{
|
|
|
int i = 0;
|
|
|
|
|
|
for (i = 0; enclink[i].name; i++) {
|
|
|
- if (enclink[i].type == type) {
|
|
|
- (enclink[i].func) (idx, direction);
|
|
|
+ if (enclink[i].link && enclink[i].type == type) {
|
|
|
+ (enclink[i].link) (idx, direction);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+int link_read(int snum, char *buf, size_t *len)
|
|
|
+{
|
|
|
+ int i = socklist[snum].enclink;
|
|
|
+
|
|
|
+ if (i != -1 && enclink[i].read)
|
|
|
+ return (enclink[i].read) (snum, buf, len);
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+char *link_write(int snum, char *buf, size_t *len)
|
|
|
+{
|
|
|
+ int i = socklist[snum].enclink;
|
|
|
+
|
|
|
+ if (i != -1 && enclink[i].write)
|
|
|
+ return ((enclink[i].write) (snum, buf, len));
|
|
|
+
|
|
|
+ return buf;
|
|
|
+}
|
|
|
+
|
|
|
struct enc_link enclink[] = {
|
|
|
- { "ghost", LINK_GHOST, link_ghost },
|
|
|
- { NULL, 0, NULL }
|
|
|
+ { "ghost", LINK_GHOST, ghost_link, ghost_write, ghost_read },
|
|
|
+ { NULL, 0, NULL, NULL, NULL }
|
|
|
};
|