]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nterface/nterfacer.c
Sigh
[irc/quakenet/newserv.git] / nterface / nterfacer.c
index a5aae2b32e46e9a86bc5cdfda5e4d2bd77b6aafe..6af51996a6dd9efd684d9a5e8a870b932c16a6f4 100644 (file)
@@ -1,7 +1,13 @@
 /*
   nterfacer
-  Copyright (C) 2004 Chris Porter.
+  Copyright (C) 2004-2006 Chris Porter.
   
+  v1.07a
+    - dumb config bug
+  v1.07
+    - made sure buf[0] = '\0'
+  v1.06
+    - tidy up
   v1.05
     - added application level ping support
   v1.04
 #include <sys/ioctl.h>
 #include <netdb.h>
 #include <string.h>
+#include <strings.h>
 
 #include "../lib/sstring.h"
 #include "../lib/irc_string.h"
 #include "../core/config.h"
 #include "../core/events.h"
+#include "../lib/version.h"
 
 #include "nterfacer.h"
 #include "logging.h"
 
+MODULE_VERSION("$Id: nterfacer.c 663 2006-05-16 17:27:36Z newserv $")
+
 struct service_node *tree = NULL;
 struct esocket_events nterfacer_events;
 struct esocket *nterfacer_sock;
@@ -42,7 +52,7 @@ struct rline *rlines = NULL;
 unsigned short nterfacer_token = BLANK_TOKEN;
 struct nterface_auto_log *nrl;
 
-struct service_node *ping;
+struct service_node *ping = NULL;
 
 int ping_handler(struct rline *ri, int argc, char **argv);
 
@@ -155,7 +165,7 @@ int load_permits(void) {
     snprintf(buf, sizeof(buf), "hostname%d", i);
     item->hostname = getcopyconfigitem("nterfacer", buf, "", 100);
     if(!item->hostname) {
-      nterface_log(nrl, NL_ERROR, "No hostname found for item %d.", item->hostname->content, i);
+      nterface_log(nrl, NL_ERROR, "No hostname found for item %d.", i);
       continue;
     }
 
@@ -240,7 +250,7 @@ int setup_listening_socket(void) {
   
   listen(fd, 5);
   
-  if(ioctl(fd, FIONBIO, &opt) !=0) {
+  if(ioctl(fd, FIONBIO, &opt)) {
     nterface_log(nrl, NL_ERROR, "Unable to set listen socket non-blocking.");
     return -1;
   }
@@ -277,7 +287,7 @@ struct handler *register_handler(struct service_node *service, char *command, in
     return NULL;
   }
 
-  hp->function = (handler_function *)fp;
+  hp->function = fp;
   hp->args = args;
 
   hp->next = service->handlers;
@@ -357,8 +367,8 @@ void nterfacer_accept_event(struct esocket *socket) {
     return;
   }
 
-  if(ioctl(newfd, FIONBIO, &opt) !=0) {
-    nterface_log(nrl, NL_ERROR, "Unable to set listen socket non-blocking.");
+  if(ioctl(newfd, FIONBIO, &opt)) {
+    nterface_log(nrl, NL_ERROR, "Unable to set accepted socket non-blocking.");
     return;
   }
   
@@ -429,7 +439,9 @@ int nterfacer_line_event(struct esocket *sock, char *newline) {
           return 1;
         }
 
-        return esocket_write_line(sock, "%s %s", hex, int_to_hex(socket->ournonce, hexbuf, NONCE_LEN));
+        if(esocket_write_line(sock, "%s %s", hex, int_to_hex(socket->ournonce, hexbuf, NONCE_LEN)))
+           return BUF_ERROR;
+        return 0;
       }
       break;
     case SS_VERSIONED:
@@ -460,7 +472,7 @@ int nterfacer_line_event(struct esocket *sock, char *newline) {
         if(!ret) {
           switch_buffer_mode(sock, socket->permit->password->content, socket->ournonce, theirnonce);
         } else {
-          return ret;
+          return BUF_ERROR;
         }
       } else {
         nterface_log(nrl, NL_INFO, "Bad CR drop: %s", socket->permit->hostname->content);
@@ -475,7 +487,9 @@ int nterfacer_line_event(struct esocket *sock, char *newline) {
         if(reason == RE_SOCKET_ERROR)
           return BUF_ERROR;
         if(reason != RE_BAD_LINE) {
-          return esocket_write_line(sock, "%d,E%d,%s", number, reason, request_error(reason));
+          if(esocket_write_line(sock, "%d,E%d,%s", number, reason, request_error(reason)))
+            return BUF_ERROR;
+          return 0;
         } else {
           return 1;
         }
@@ -487,7 +501,7 @@ int nterfacer_line_event(struct esocket *sock, char *newline) {
 }
 
 int nterfacer_new_rline(char *line, struct esocket *socket, int *number) {
-  char *sp, *p, *parsebuf, *pp, commandbuf[MAX_BUFSIZE], *args[MAX_ARGS], *newp;
+  char *sp, *p, *parsebuf = NULL, *pp, commandbuf[MAX_BUFSIZE], *args[MAX_ARGS], *newp;
   int argcount;
   struct service_node *service;
   struct rline *prequest;
@@ -587,7 +601,7 @@ int nterfacer_new_rline(char *line, struct esocket *socket, int *number) {
     *newp = '\0';
   }
   if(argcount < hl->args) {
-    if(argcount)
+    if(argcount && parsebuf)
       free(parsebuf);
     return RE_WRONG_ARG_COUNT;
   }
@@ -595,13 +609,14 @@ int nterfacer_new_rline(char *line, struct esocket *socket, int *number) {
   prequest = (struct rline *)malloc(sizeof(struct rline));
   if(!prequest) {
     MemError();
-    if(argcount)
+    if(argcount && parsebuf)
       free(parsebuf);
     return RE_MEM_ERROR;
   }
 
   prequest->service = service;
   prequest->handler = hl;
+  prequest->buf[0] = '\0';
   prequest->curpos = prequest->buf;
   prequest->tag = NULL;
   prequest->id = *number;
@@ -609,9 +624,9 @@ int nterfacer_new_rline(char *line, struct esocket *socket, int *number) {
   prequest->socket = socket;
 
   rlines = prequest;
-  re = ((handler_function)hl->function)(prequest, argcount, args);
+  re = (hl->function)(prequest, argcount, args);
   
-  if(argcount)
+  if(argcount && parsebuf)
     free(parsebuf);
 
   return re;
@@ -669,6 +684,7 @@ int ri_error(struct rline *li, int error_code, char *format, ...) {
   char buf[MAX_BUFSIZE], escapedbuf[MAX_BUFSIZE * 2 + 1], *p, *tp;
   struct rline *pp, *lp = NULL;
   va_list ap;
+  int retval = RE_OK;
 
   if(li->socket) {
     va_start(ap, format);
@@ -679,7 +695,8 @@ int ri_error(struct rline *li, int error_code, char *format, ...) {
       if((*p == ',') || (*p == '\\'))
         *tp++ = '\\';
 
-    esocket_write_line(li->socket, "%d,OE%d,%s", li->id, error_code, escapedbuf);
+    if(esocket_write_line(li->socket, "%d,OE%d,%s", li->id, error_code, escapedbuf))
+      retval = RE_SOCKET_ERROR;
   }
 
   for(pp=rlines;pp;lp=pp,pp=pp->next) {
@@ -694,7 +711,7 @@ int ri_error(struct rline *li, int error_code, char *format, ...) {
     }
   }
   
-  return RE_OK;
+  return retval;
 }
 
 int ri_final(struct rline *li) {