|
|
@@ -915,56 +915,49 @@ int main(int argc, char **argv)
|
|
|
xx = sockgets(buf, &i);
|
|
|
|
|
|
if (xx >= 0) { /* Non-error */
|
|
|
- for (idx = 0; idx < dcc_total; idx++) {//FIXME: This is looking up the idx for the sock, looping quite a bit, needs to be O(1)
|
|
|
- if (dcc[idx].type && dcc[idx].sock == xx) {
|
|
|
- if (likely(dcc[idx].type && dcc[idx].type->activity)) {
|
|
|
- /* Traffic stats */
|
|
|
- if (dcc[idx].type->name) {
|
|
|
- if (!strncmp(dcc[idx].type->name, "BOT", 3))
|
|
|
- traffic.in_today.bn += strlen(buf) + 1;
|
|
|
- else if (!strcmp(dcc[idx].type->name, "SERVER"))
|
|
|
- traffic.in_today.irc += strlen(buf) + 1;
|
|
|
- else if (!strncmp(dcc[idx].type->name, "CHAT", 4))
|
|
|
- traffic.in_today.dcc += strlen(buf) + 1;
|
|
|
- else if (!strncmp(dcc[idx].type->name, "FILES", 5))
|
|
|
- traffic.in_today.dcc += strlen(buf) + 1;
|
|
|
- else if (!strcmp(dcc[idx].type->name, "SEND"))
|
|
|
- traffic.in_today.trans += strlen(buf) + 1;
|
|
|
- else if (!strncmp(dcc[idx].type->name, "GET", 3))
|
|
|
- traffic.in_today.trans += strlen(buf) + 1;
|
|
|
- else
|
|
|
- traffic.in_today.unknown += strlen(buf) + 1;
|
|
|
- }
|
|
|
- dcc[idx].type->activity(idx, buf, (size_t) i);
|
|
|
- } else
|
|
|
- putlog(LOG_MISC, "*",
|
|
|
- STR("!!! untrapped dcc activity: type %s, sock %d"),
|
|
|
- dcc[idx].type->name, dcc[idx].sock);
|
|
|
- break;
|
|
|
- }
|
|
|
+ if ((idx = findanyidx(xx)) != -1) {
|
|
|
+ if (likely(dcc[idx].type->activity)) {
|
|
|
+ /* Traffic stats */
|
|
|
+ if (dcc[idx].type->name) {
|
|
|
+ if (!strncmp(dcc[idx].type->name, "BOT", 3))
|
|
|
+ traffic.in_today.bn += strlen(buf) + 1;
|
|
|
+ else if (!strcmp(dcc[idx].type->name, "SERVER"))
|
|
|
+ traffic.in_today.irc += strlen(buf) + 1;
|
|
|
+ else if (!strncmp(dcc[idx].type->name, "CHAT", 4))
|
|
|
+ traffic.in_today.dcc += strlen(buf) + 1;
|
|
|
+ else if (!strncmp(dcc[idx].type->name, "FILES", 5))
|
|
|
+ traffic.in_today.dcc += strlen(buf) + 1;
|
|
|
+ else if (!strcmp(dcc[idx].type->name, "SEND"))
|
|
|
+ traffic.in_today.trans += strlen(buf) + 1;
|
|
|
+ else if (!strncmp(dcc[idx].type->name, "GET", 3))
|
|
|
+ traffic.in_today.trans += strlen(buf) + 1;
|
|
|
+ else
|
|
|
+ traffic.in_today.unknown += strlen(buf) + 1;
|
|
|
+ }
|
|
|
+ dcc[idx].type->activity(idx, buf, (size_t) i);
|
|
|
+ } else
|
|
|
+ putlog(LOG_MISC, "*",
|
|
|
+ STR("!!! untrapped dcc activity: type %s, sock %d"),
|
|
|
+ dcc[idx].type->name, dcc[idx].sock);
|
|
|
}
|
|
|
} else if (unlikely(xx == -1)) { /* EOF from someone */
|
|
|
if (unlikely(i == STDOUT && !backgrd))
|
|
|
fatal(STR("END OF FILE ON TERMINAL"), 0);
|
|
|
- for (idx = 0; idx < dcc_total; idx++) {//FIXME: Same here
|
|
|
- if (dcc[idx].type && dcc[idx].sock == i) {
|
|
|
- sdprintf(STR("EOF on '%s' idx: %d"), dcc[idx].type ? dcc[idx].type->name : "unknown", idx);
|
|
|
- if (likely(dcc[idx].type->eof))
|
|
|
- dcc[idx].type->eof(idx);
|
|
|
- else {
|
|
|
- putlog(LOG_MISC, "*",
|
|
|
- STR("*** ATTENTION: DEAD SOCKET (%d) OF TYPE %s UNTRAPPED"),
|
|
|
- i, dcc[idx].type ? dcc[idx].type->name : "*UNKNOWN*");
|
|
|
- killsock(i);
|
|
|
- lostdcc(idx);
|
|
|
- }
|
|
|
- idx = dcc_total + 1;
|
|
|
- }
|
|
|
- }
|
|
|
- if (unlikely(idx == dcc_total)) {
|
|
|
- putlog(LOG_MISC, "*", STR("(@) EOF socket %d, not a dcc socket, not anything."), i);
|
|
|
- close(i);
|
|
|
- killsock(i);
|
|
|
+ if ((idx = findanyidx(i)) != -1) {
|
|
|
+ sdprintf(STR("EOF on '%s' idx: %d"), dcc[idx].type ? dcc[idx].type->name : "unknown", idx);
|
|
|
+ if (likely(dcc[idx].type->eof))
|
|
|
+ dcc[idx].type->eof(idx);
|
|
|
+ else {
|
|
|
+ putlog(LOG_MISC, "*",
|
|
|
+ STR("*** ATTENTION: DEAD SOCKET (%d) OF TYPE %s UNTRAPPED"),
|
|
|
+ i, dcc[idx].type ? dcc[idx].type->name : "*UNKNOWN*");
|
|
|
+ killsock(i);
|
|
|
+ lostdcc(idx);
|
|
|
+ }
|
|
|
+ } else if (unlikely(idx == -1)) {
|
|
|
+ putlog(LOG_MISC, "*", STR("(@) EOF socket %d, not a dcc socket, not anything."), i);
|
|
|
+ close(i);
|
|
|
+ killsock(i);
|
|
|
}
|
|
|
} else if (unlikely(xx == -2 && errno != EINTR)) { /* select() error */
|
|
|
putlog(LOG_MISC, "*", STR("* Socket error #%d; recovering."), errno);
|