Просмотр исходного кода

* Use findanyidx() in more places

Bryan Drewery 16 лет назад
Родитель
Сommit
666730dd3a
3 измененных файлов с 44 добавлено и 52 удалено
  1. 39 46
      src/main.c
  2. 4 6
      src/net.c
  3. 1 0
      src/net.h

+ 39 - 46
src/main.c

@@ -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);

+ 4 - 6
src/net.c

@@ -1333,14 +1333,12 @@ int findanysnum(register int sock)
   return -1;
 }
 
-static int findanyidx(register int sock)
+int findanyidx(int sock)
 {
-  register int j;
-
   if (sock != -1)
-    for (j = 0; j < dcc_total; j++)
-      if (dcc[j].type && dcc[j].sock == sock)
-        return j;
+    for (int idx = 0; idx < dcc_total; ++idx)
+      if (dcc[idx].type && dcc[idx].sock == sock)
+        return idx;
 
   return -1;
 }

+ 1 - 0
src/net.h

@@ -116,6 +116,7 @@ int sockprotocol(int);
 void real_killsock(int, const char *, int);
 int answer(int, char *, in_addr_t *, port_t *, int);
 int findanysnum(register int);
+int findanyidx(register int sock);
 int open_listen(port_t *);
 int open_listen_by_af(port_t *, int);
 int open_listen_addr_by_af(const char*, port_t *, int);