|
@@ -222,9 +222,15 @@ greet_new_bot(int idx)
|
|
|
dcc[idx].u.bot->version[0] = 0;
|
|
dcc[idx].u.bot->version[0] = 0;
|
|
|
dcc[idx].u.bot->sysname[0] = 0;
|
|
dcc[idx].u.bot->sysname[0] = 0;
|
|
|
dcc[idx].u.bot->numver = 0;
|
|
dcc[idx].u.bot->numver = 0;
|
|
|
- if (conf.bot->hub && dcc[idx].user && (!(dcc[idx].user->flags & USER_OP))) {
|
|
|
|
|
- putlog(LOG_BOTS, "*", "Rejecting link from %s", dcc[idx].nick);
|
|
|
|
|
- dprintf(idx, "error You are being rejected.\n");
|
|
|
|
|
|
|
+ // Reject -o bots, and if we're a localhub who hasnt linked to hub yet, dont allow links in
|
|
|
|
|
+ if ((conf.bot->hub || conf.bot->localhub) && dcc[idx].user && (!(dcc[idx].user->flags & USER_OP) || (conf.bot->localhub && (dcc[idx].status & STAT_UNIXDOMAIN) && !have_linked_to_hub))) {
|
|
|
|
|
+ if (!(dcc[idx].user->flags & USER_OP)) {
|
|
|
|
|
+ putlog(LOG_BOTS, "*", "Rejecting link from %s", dcc[idx].nick);
|
|
|
|
|
+ dprintf(idx, "error You are being rejected.\n");
|
|
|
|
|
+ } else if (conf.bot->localhub && !have_linked_to_hub) {
|
|
|
|
|
+ putlog(LOG_BOTS, "*", "Delaying link from %s", dcc[idx].nick);
|
|
|
|
|
+ dprintf(idx, "error Delaying your link until I get userfile.\n");
|
|
|
|
|
+ }
|
|
|
dprintf(idx, "bye\n");
|
|
dprintf(idx, "bye\n");
|
|
|
killsock(dcc[idx].sock);
|
|
killsock(dcc[idx].sock);
|
|
|
lostdcc(idx);
|
|
lostdcc(idx);
|
|
@@ -300,20 +306,28 @@ bot_version(int idx, char *par)
|
|
|
if (par[0])
|
|
if (par[0])
|
|
|
vversion = newsplit(&par);
|
|
vversion = newsplit(&par);
|
|
|
|
|
|
|
|
- if (conf.bot->hub) {
|
|
|
|
|
|
|
+ if (conf.bot->hub || (conf.bot->localhub && (dcc[idx].status & STAT_UNIXDOMAIN))) {
|
|
|
putlog(LOG_BOTS, "*", "Linked to %s.\n", dcc[idx].nick);
|
|
putlog(LOG_BOTS, "*", "Linked to %s.\n", dcc[idx].nick);
|
|
|
chatout("*** Linked to %s.\n", dcc[idx].nick);
|
|
chatout("*** Linked to %s.\n", dcc[idx].nick);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ putlog(LOG_BOTS, "*", "Linked to botnet.");
|
|
|
|
|
+ chatout("*** Linked to botnet.\n");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ if (conf.bot->hub || conf.bot->localhub) {
|
|
|
if (bot_hublevel(dcc[idx].user) < 999) {
|
|
if (bot_hublevel(dcc[idx].user) < 999) {
|
|
|
- if (!bot_aggressive_to(dcc[idx].user)) //not aggressive, so they are technically my uplink.
|
|
|
|
|
|
|
+ if (!bot_aggressive_to(dcc[idx].user)) { //not aggressive, so they are technically my uplink.
|
|
|
uplink_idx = idx;
|
|
uplink_idx = idx;
|
|
|
|
|
+ // This is now done in share_endstartup
|
|
|
|
|
+ //have_linked_to_hub = 1;
|
|
|
|
|
+ }
|
|
|
dcc[idx].hub = 1;
|
|
dcc[idx].hub = 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
botnet_send_nlinked(idx, dcc[idx].nick, conf.bot->nick, '!', vlocalhub, vbuildts, vcommit, vversion);
|
|
botnet_send_nlinked(idx, dcc[idx].nick, conf.bot->nick, '!', vlocalhub, vbuildts, vcommit, vversion);
|
|
|
} else {
|
|
} else {
|
|
|
- putlog(LOG_BOTS, "*", "Linked to botnet.");
|
|
|
|
|
- chatout("*** Linked to botnet.\n");
|
|
|
|
|
|
|
+ // This is now done in share_endstartup
|
|
|
|
|
+ //have_linked_to_hub = 1;
|
|
|
uplink_idx = idx;
|
|
uplink_idx = idx;
|
|
|
dcc[idx].hub = 1;
|
|
dcc[idx].hub = 1;
|
|
|
}
|
|
}
|
|
@@ -347,7 +361,8 @@ failed_link(int idx)
|
|
|
}
|
|
}
|
|
|
strlcpy(s, dcc[idx].nick, sizeof(s));
|
|
strlcpy(s, dcc[idx].nick, sizeof(s));
|
|
|
lostdcc(idx);
|
|
lostdcc(idx);
|
|
|
- autolink_cycle(s); /* Check for more auto-connections */
|
|
|
|
|
|
|
+ if (conf.bot->hub || conf.bot->localhub)
|
|
|
|
|
+ autolink_cycle(s); /* Check for more auto-connections */
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -538,6 +553,7 @@ display_dcc_bot(int idx, char *buf, size_t bufsiz)
|
|
|
buf[i++] = b_status(idx) & STAT_OFFEREDU ? 'B' : 'b';
|
|
buf[i++] = b_status(idx) & STAT_OFFEREDU ? 'B' : 'b';
|
|
|
buf[i++] = b_status(idx) & STAT_SENDINGU ? 'D' : 'd';
|
|
buf[i++] = b_status(idx) & STAT_SENDINGU ? 'D' : 'd';
|
|
|
buf[i++] = b_status(idx) & STAT_GETTINGU ? 'E' : 'e';
|
|
buf[i++] = b_status(idx) & STAT_GETTINGU ? 'E' : 'e';
|
|
|
|
|
+ buf[i++] = b_status(idx) & STAT_UNIXDOMAIN ? 'Z' : 'z';
|
|
|
#ifdef USE_IPV6
|
|
#ifdef USE_IPV6
|
|
|
if (sockprotocol(dcc[idx].sock) == AF_INET6 && dcc[idx].host6[0])
|
|
if (sockprotocol(dcc[idx].sock) == AF_INET6 && dcc[idx].host6[0])
|
|
|
buf[i++] = '6';
|
|
buf[i++] = '6';
|
|
@@ -984,10 +1000,13 @@ dcc_chat_pass(int idx, char *buf, int atr)
|
|
|
} else if (!strcasecmp(pass, STR("neg."))) { /* we're done, link up! */
|
|
} else if (!strcasecmp(pass, STR("neg."))) { /* we're done, link up! */
|
|
|
dcc[idx].type = &DCC_BOT_NEW;
|
|
dcc[idx].type = &DCC_BOT_NEW;
|
|
|
dcc[idx].u.bot = (struct bot_info *) my_calloc(1, sizeof(struct bot_info));
|
|
dcc[idx].u.bot = (struct bot_info *) my_calloc(1, sizeof(struct bot_info));
|
|
|
- dcc[idx].status = STAT_CALLED;
|
|
|
|
|
|
|
+ if (dcc[idx].status & STAT_UNIXDOMAIN)
|
|
|
|
|
+ dcc[idx].status = STAT_UNIXDOMAIN|STAT_CALLED;
|
|
|
|
|
+ else
|
|
|
|
|
+ dcc[idx].status = STAT_CALLED;
|
|
|
dprintf(idx, "goodbye!\n");
|
|
dprintf(idx, "goodbye!\n");
|
|
|
greet_new_bot(idx);
|
|
greet_new_bot(idx);
|
|
|
- if (conf.bot->hub)
|
|
|
|
|
|
|
+ if (conf.bot->hub || conf.bot->localhub)
|
|
|
send_timesync(idx);
|
|
send_timesync(idx);
|
|
|
} else if (!strcasecmp(pass, STR("neg"))) {
|
|
} else if (!strcasecmp(pass, STR("neg"))) {
|
|
|
int snum = findanysnum(dcc[idx].sock);
|
|
int snum = findanysnum(dcc[idx].sock);
|
|
@@ -1371,6 +1390,8 @@ dcc_telnet(int idx, char *buf, int ii)
|
|
|
in_addr_t ip;
|
|
in_addr_t ip;
|
|
|
port_t port;
|
|
port_t port;
|
|
|
char s[UHOSTLEN + 1] = "";
|
|
char s[UHOSTLEN + 1] = "";
|
|
|
|
|
+ int i;
|
|
|
|
|
+ char x[1024] = "";
|
|
|
|
|
|
|
|
if (dcc_total + 1 > max_dcc) {
|
|
if (dcc_total + 1 > max_dcc) {
|
|
|
int j;
|
|
int j;
|
|
@@ -1395,6 +1416,24 @@ dcc_telnet(int idx, char *buf, int ii)
|
|
|
/* Buffer data received on this socket. */
|
|
/* Buffer data received on this socket. */
|
|
|
sockoptions(sock, EGG_OPTION_SET, SOCK_BUFFER);
|
|
sockoptions(sock, EGG_OPTION_SET, SOCK_BUFFER);
|
|
|
|
|
|
|
|
|
|
+ int af_type = sockprotocol(sock);
|
|
|
|
|
+
|
|
|
|
|
+ if (af_type == AF_UNIX) {
|
|
|
|
|
+
|
|
|
|
|
+ //i = new_dcc(&DCC_IDENT, 0);
|
|
|
|
|
+ i = new_dcc(&DCC_TELNET_ID, 0);
|
|
|
|
|
+
|
|
|
|
|
+ simple_snprintf(x, sizeof(x), "UNKNOWN@localhost");
|
|
|
|
|
+ dcc[i].sock = sock;
|
|
|
|
|
+ dcc[i].uint.ident_sock = dcc[idx].sock;
|
|
|
|
|
+ dcc[i].port = 0;
|
|
|
|
|
+ dcc[i].timeval = now;
|
|
|
|
|
+ strlcpy(dcc[i].nick, "*", NICKLEN);
|
|
|
|
|
+ putlog(LOG_BOTS, "*", "Connection over local socket: %s", s);
|
|
|
|
|
+ dcc_telnet_got_ident(i, x);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
#if SIZEOF_SHORT == 2
|
|
#if SIZEOF_SHORT == 2
|
|
|
if (port < 1024) {
|
|
if (port < 1024) {
|
|
|
#else
|
|
#else
|
|
@@ -1405,9 +1444,6 @@ dcc_telnet(int idx, char *buf, int ii)
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- char x[1024] = "";
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
putlog(LOG_DEBUG, "*", "Telnet connection: %s/%d", s, port);
|
|
putlog(LOG_DEBUG, "*", "Telnet connection: %s/%d", s, port);
|
|
|
|
|
|
|
|
// Are they ignored by IP?
|
|
// Are they ignored by IP?
|
|
@@ -1431,7 +1467,7 @@ dcc_telnet(int idx, char *buf, int ii)
|
|
|
dcc[i].user = get_user_by_host(x); /* check for matching -telnet!telnet@ip */
|
|
dcc[i].user = get_user_by_host(x); /* check for matching -telnet!telnet@ip */
|
|
|
strlcpy(dcc[i].host, s, UHOSTLEN);
|
|
strlcpy(dcc[i].host, s, UHOSTLEN);
|
|
|
#ifdef USE_IPV6
|
|
#ifdef USE_IPV6
|
|
|
- if (sockprotocol(sock) == AF_INET6)
|
|
|
|
|
|
|
+ if (af_type == AF_INET6)
|
|
|
strlcpy(dcc[i].host6, s, sizeof(dcc[i].host6));
|
|
strlcpy(dcc[i].host6, s, sizeof(dcc[i].host6));
|
|
|
#endif /* USE_IPV6 */
|
|
#endif /* USE_IPV6 */
|
|
|
dcc[i].port = port;
|
|
dcc[i].port = port;
|
|
@@ -1738,6 +1774,8 @@ dcc_telnet_id(int idx, char *buf, int atr)
|
|
|
}
|
|
}
|
|
|
correct_handle(nick);
|
|
correct_handle(nick);
|
|
|
strlcpy(dcc[idx].nick, nick, NICKLEN);
|
|
strlcpy(dcc[idx].nick, nick, NICKLEN);
|
|
|
|
|
+ if (!strcmp(dcc[idx].host, "UNKNOWN@localhost"))
|
|
|
|
|
+ simple_snprintf(dcc[idx].host, sizeof(dcc[idx].host), "%s@localhost", nick);
|
|
|
if (dcc[idx].user->bot) {
|
|
if (dcc[idx].user->bot) {
|
|
|
if (!strcasecmp(conf.bot->nick, dcc[idx].nick)) {
|
|
if (!strcasecmp(conf.bot->nick, dcc[idx].nick)) {
|
|
|
putlog(LOG_BOTS, "*", "Refused telnet connection from %s (tried using my botnetnick)", dcc[idx].host);
|
|
putlog(LOG_BOTS, "*", "Refused telnet connection from %s (tried using my botnetnick)", dcc[idx].host);
|
|
@@ -1757,7 +1795,7 @@ dcc_telnet_id(int idx, char *buf, int atr)
|
|
|
} else {
|
|
} else {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (dcc[idx].bot) {
|
|
|
|
|
|
|
+ if (dcc[idx].bot && !(dcc[idx].status & STAT_UNIXDOMAIN)) {
|
|
|
char shost[UHOSTLEN + 20] = "", sip[UHOSTLEN + 20] = "", user[30] = "";
|
|
char shost[UHOSTLEN + 20] = "", sip[UHOSTLEN + 20] = "", user[30] = "";
|
|
|
simple_snprintf(shost, sizeof(shost), "-telnet!%s", dcc[idx].host);
|
|
simple_snprintf(shost, sizeof(shost), "-telnet!%s", dcc[idx].host);
|
|
|
char *p = strchr(dcc[idx].host, '@');
|
|
char *p = strchr(dcc[idx].host, '@');
|
|
@@ -1825,7 +1863,7 @@ dcc_telnet_pass(int idx, int atr)
|
|
|
strlcpy(dcc[idx].u.chat->con_chan, chanset ? chanset->dname : "*", sizeof(dummy.con_chan));
|
|
strlcpy(dcc[idx].u.chat->con_chan, chanset ? chanset->dname : "*", sizeof(dummy.con_chan));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (conf.bot->hub) {
|
|
|
|
|
|
|
+ if (conf.bot->hub || (conf.bot->localhub && (dcc[idx].status & STAT_UNIXDOMAIN))) {
|
|
|
if (dcc[idx].bot) {
|
|
if (dcc[idx].bot) {
|
|
|
/* negotiate a new linking scheme */
|
|
/* negotiate a new linking scheme */
|
|
|
int i = 0;
|
|
int i = 0;
|
|
@@ -1852,7 +1890,10 @@ dcc_telnet_pass(int idx, int atr)
|
|
|
static void
|
|
static void
|
|
|
eof_dcc_telnet_id(int idx)
|
|
eof_dcc_telnet_id(int idx)
|
|
|
{
|
|
{
|
|
|
- putlog(LOG_MISC, "*", "Lost telnet connection to %s/%d", dcc[idx].host, dcc[idx].port);
|
|
|
|
|
|
|
+ if (dcc[idx].port)
|
|
|
|
|
+ putlog(LOG_MISC, "*", "Lost telnet connection to %s/%d", dcc[idx].host, dcc[idx].port);
|
|
|
|
|
+ else
|
|
|
|
|
+ putlog(LOG_MISC, "*", "Lost local connection for: %s", dcc[idx].host);
|
|
|
killsock(dcc[idx].sock);
|
|
killsock(dcc[idx].sock);
|
|
|
lostdcc(idx);
|
|
lostdcc(idx);
|
|
|
}
|
|
}
|
|
@@ -2034,49 +2075,56 @@ dcc_telnet_got_ident(int i, char *host)
|
|
|
|
|
|
|
|
strlcpy(dcc[i].host, host, UHOSTLEN);
|
|
strlcpy(dcc[i].host, host, UHOSTLEN);
|
|
|
|
|
|
|
|
- char shost[UHOSTLEN + 20] = "", sip[UHOSTLEN + 20] = "";
|
|
|
|
|
- char *p = strchr(host, '@');
|
|
|
|
|
- *p = 0;
|
|
|
|
|
|
|
+ bool unix_domain = 0;
|
|
|
|
|
+ if (!strcmp(host, "UNKNOWN@localhost"))
|
|
|
|
|
+ unix_domain = 1;
|
|
|
|
|
|
|
|
- simple_snprintf(shost, sizeof(shost), "-telnet!%s", dcc[i].host);
|
|
|
|
|
- simple_snprintf(sip, sizeof(sip), "-telnet!%s@%s", host, iptostr(htonl(dcc[i].addr)));
|
|
|
|
|
|
|
|
|
|
- if (match_ignore(shost) || match_ignore(sip)) {
|
|
|
|
|
- putlog(LOG_DEBUG, "*", "Ignored telnet connection from: %s[%s]",dcc[i].host, iptostr(htonl(dcc[i].addr)));
|
|
|
|
|
- killsock(dcc[i].sock);
|
|
|
|
|
- lostdcc(i);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (protect_telnet) {
|
|
|
|
|
- struct userrec *u = NULL;
|
|
|
|
|
- bool ok = 1;
|
|
|
|
|
|
|
+ if (!unix_domain) {
|
|
|
|
|
+ char shost[UHOSTLEN + 20] = "", sip[UHOSTLEN + 20] = "";
|
|
|
|
|
+ char *p = strchr(host, '@');
|
|
|
|
|
+ *p = 0;
|
|
|
|
|
|
|
|
- u = dcc[i].user;
|
|
|
|
|
- if (!u)
|
|
|
|
|
- u = get_user_by_host(sip); /* Check for -telnet!ident@ip */
|
|
|
|
|
- if (!u)
|
|
|
|
|
- u = get_user_by_host(shost); /* Check for -telnet!ident@host */
|
|
|
|
|
- if (!u)
|
|
|
|
|
- ok = 0;
|
|
|
|
|
|
|
+ simple_snprintf(shost, sizeof(shost), "-telnet!%s", dcc[i].host);
|
|
|
|
|
+ simple_snprintf(sip, sizeof(sip), "-telnet!%s@%s", host, iptostr(htonl(dcc[i].addr)));
|
|
|
|
|
|
|
|
- if (ok && u && conf.bot->hub && !(u->flags & USER_HUBA))
|
|
|
|
|
- ok = 0;
|
|
|
|
|
- /* if I am a chanhub and they dont have +c then drop */
|
|
|
|
|
- if (ok && (!conf.bot->hub && ischanhub() && u && !(u->flags & USER_CHUBA)))
|
|
|
|
|
- ok = 0;
|
|
|
|
|
-/* else if (!(u->flags & USER_PARTY))
|
|
|
|
|
- ok = 0; */
|
|
|
|
|
- if (!ok && u && u->bot)
|
|
|
|
|
- ok = 1;
|
|
|
|
|
- if (!ok && (dcc[idx].status & LSTN_PUBLIC))
|
|
|
|
|
- ok = 1;
|
|
|
|
|
- if (!ok) {
|
|
|
|
|
- putlog(LOG_MISC, "*", "Denied telnet: %s, No Access", dcc[i].host);
|
|
|
|
|
|
|
+ if (match_ignore(shost) || match_ignore(sip)) {
|
|
|
|
|
+ putlog(LOG_DEBUG, "*", "Ignored telnet connection from: %s[%s]",dcc[i].host, iptostr(htonl(dcc[i].addr)));
|
|
|
killsock(dcc[i].sock);
|
|
killsock(dcc[i].sock);
|
|
|
lostdcc(i);
|
|
lostdcc(i);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if (protect_telnet) {
|
|
|
|
|
+ struct userrec *u = NULL;
|
|
|
|
|
+ bool ok = 1;
|
|
|
|
|
+
|
|
|
|
|
+ u = dcc[i].user;
|
|
|
|
|
+ if (!u)
|
|
|
|
|
+ u = get_user_by_host(sip); /* Check for -telnet!ident@ip */
|
|
|
|
|
+ if (!u)
|
|
|
|
|
+ u = get_user_by_host(shost); /* Check for -telnet!ident@host */
|
|
|
|
|
+ if (!u)
|
|
|
|
|
+ ok = 0;
|
|
|
|
|
+
|
|
|
|
|
+ if (ok && u && conf.bot->hub && !(u->flags & USER_HUBA))
|
|
|
|
|
+ ok = 0;
|
|
|
|
|
+ /* if I am a chanhub and they dont have +c then drop */
|
|
|
|
|
+ if (ok && (!conf.bot->hub && ischanhub() && u && !(u->flags & USER_CHUBA)))
|
|
|
|
|
+ ok = 0;
|
|
|
|
|
+ /* else if (!(u->flags & USER_PARTY))
|
|
|
|
|
+ ok = 0; */
|
|
|
|
|
+ if (!ok && u && u->bot)
|
|
|
|
|
+ ok = 1;
|
|
|
|
|
+ if (!ok && (dcc[idx].status & LSTN_PUBLIC))
|
|
|
|
|
+ ok = 1;
|
|
|
|
|
+ if (!ok) {
|
|
|
|
|
+ putlog(LOG_MISC, "*", "Denied telnet: %s, No Access", dcc[i].host);
|
|
|
|
|
+ killsock(dcc[i].sock);
|
|
|
|
|
+ lostdcc(i);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Do not buffer data anymore. All received and stored data is passed
|
|
/* Do not buffer data anymore. All received and stored data is passed
|
|
@@ -2088,6 +2136,9 @@ dcc_telnet_got_ident(int i, char *host)
|
|
|
/* Copy acceptable-nick/host mask */
|
|
/* Copy acceptable-nick/host mask */
|
|
|
dcc[i].status = (STAT_TELNET | STAT_ECHO | STAT_COLOR | STAT_BANNER | STAT_CHANNELS | STAT_BOTS | STAT_WHOM);
|
|
dcc[i].status = (STAT_TELNET | STAT_ECHO | STAT_COLOR | STAT_BANNER | STAT_CHANNELS | STAT_BOTS | STAT_WHOM);
|
|
|
|
|
|
|
|
|
|
+ if (unix_domain)
|
|
|
|
|
+ dcc[i].status |= STAT_UNIXDOMAIN;
|
|
|
|
|
+
|
|
|
/* Copy acceptable-nick/host mask */
|
|
/* Copy acceptable-nick/host mask */
|
|
|
strlcpy(dcc[i].nick, dcc[idx].host, HANDLEN);
|
|
strlcpy(dcc[i].nick, dcc[idx].host, HANDLEN);
|
|
|
dcc[i].timeval = now;
|
|
dcc[i].timeval = now;
|
|
@@ -2096,7 +2147,7 @@ dcc_telnet_got_ident(int i, char *host)
|
|
|
/* This is so we dont tell someone doing a portscan anything
|
|
/* This is so we dont tell someone doing a portscan anything
|
|
|
* about ourselves. <cybah>
|
|
* about ourselves. <cybah>
|
|
|
*/
|
|
*/
|
|
|
- if (conf.bot->hub)
|
|
|
|
|
|
|
+ if (conf.bot->hub || (conf.bot->localhub && unix_domain))
|
|
|
dprintf(i, " \n"); /* represents hub that support new linking scheme */
|
|
dprintf(i, " \n"); /* represents hub that support new linking scheme */
|
|
|
else
|
|
else
|
|
|
dprintf(i, "%s\n", response(RES_USERNAME));
|
|
dprintf(i, "%s\n", response(RES_USERNAME));
|