made cmd_extscript WIN32 compatible
[NeonServV5.git] / src / cmd_neonserv_extscript.c
index 53b173dfb5254d1231f4e7ae493679b82bcc6377..1d97ac0fc576bb5bafa1adbfdd62c8802565713e 100644 (file)
@@ -1,4 +1,4 @@
-/* cmd_neonserv_extscript.c - NeonServ v5.1
+/* cmd_neonserv_extscript.c - NeonServ v5.2
  * Copyright (C) 2011  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -32,6 +32,7 @@ CMD_BIND(neonserv_cmd_extscript) {
     int commandpos = 0;
     char part[MAXLEN];
     int partpos;
+    int escape_param;
     int answere_channel = 0;
     //check first arg
     if(argc && !stricmp(argv[0], "toys")) {
@@ -66,6 +67,7 @@ CMD_BIND(neonserv_cmd_extscript) {
     commandpos = sprintf(command, "%s", argv[0]);
     for(i = 1; i < argc-1; i++) {
         partpos = 0;
+        escape_param = 1;
         if(argv[i][0] == '$') {
             argv[i]++;
             if(argv[i][strlen(argv[i])-1] == '-') {
@@ -84,44 +86,63 @@ CMD_BIND(neonserv_cmd_extscript) {
                 partpos = sprintf(part, "%s", ((user->flags & USERFLAG_ISAUTHED) ? user->auth : ""));
             } else if(!strcmp(argv[i], "access")) {
                 if(chan)
-                    partpos = sprintf(part, "%d", getChannelAccess(user, chan, 0));
+                    partpos = sprintf(part, "%d", getChannelAccess(user, chan));
             }
         } else {
             partpos = sprintf(part, "%s", argv[i]);
+            escape_param = 0;
         }
         //escape shell argument
         command[commandpos++] = ' ';
-        command[commandpos++] = '\'';
-        for(j = 0; j < partpos; j++) {
-            if(part[j] == '\'') {
-                command[commandpos++] = '\'';
-                command[commandpos++] = '\\';
-                command[commandpos++] = '\'';
-                command[commandpos++] = '\'';
-            } else
-                command[commandpos++] = part[j];
-        }
-        command[commandpos++] = '\'';
+        if(escape_param) {
+            command[commandpos++] = '\'';
+            for(j = 0; j < partpos; j++) {
+                if(part[j] == '\'') {
+                    command[commandpos++] = '\'';
+                    command[commandpos++] = '\\';
+                    command[commandpos++] = '\'';
+                    command[commandpos++] = '\'';
+                } else
+                    command[commandpos++] = part[j];
+            }
+            command[commandpos++] = '\'';
+        } else
+            commandpos += sprintf(command + commandpos, " %s", part);
     }
     command[commandpos] = '\0';
     //we should now have a valid command
-    FILE *fp;
-    fp = popen(command, "r");
-    if (fp) {
-        char *a;
-        while (fgets(command, 1024, fp) != NULL) {
-            if((a = strchr(command, '\n'))) 
-                *a = '\0';
-            if(answere_channel) {
-                putsock(client, "PRIVMSG %s :%s", chan->name, command);
-            } else
-                reply(getTextBot(), user, "%s", command);
+    struct ClientSocket *textbot = getTextBot();
+       #ifndef WIN32
+    pid_t pID = fork();
+    if (pID == 0) { //We're the child process :D
+        pID = fork();
+        if(pID < 0) exit(EXIT_FAILURE);
+        if(pID != 0) exit(EXIT_SUCCESS);
+       #endif
+        FILE *fp;
+        fp = popen(command, "r");
+        if (fp) {
+            char *a;
+            while (fgets(command, 1024, fp) != NULL) {
+                if((a = strchr(command, '\n'))) 
+                    *a = '\0';
+                if(answere_channel)
+                    putsock(client, "PRIVMSG %s :%s", chan->name, command);
+                else
+                    reply(textbot, user, "%s", command);
+            }
+            pclose(fp);
+        } else {
+            reply(getTextBot(), user, "internal bot error - please contact an administrator!");
         }
-        pclose(fp);
-    } else {
-        //error
+       #ifndef WIN32
+        exit(EXIT_FAILURE);
+    } else if (pID < 0) {
         reply(getTextBot(), user, "internal bot error - please contact an administrator!");
-        return;
+    } else {
+        //parent bot - continue program
+        wait(NULL);
     }
+       #endif
 }