X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fcmd_neonserv_extscript.c;h=d060d57e1ddc2155ca34d9bd7538aed04a1b0bd2;hb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;hp=1d97ac0fc576bb5bafa1adbfdd62c8802565713e;hpb=14085e0d6c1baf9ba478cd5d436a59b2f1f261c4;p=NeonServV5.git diff --git a/src/cmd_neonserv_extscript.c b/src/cmd_neonserv_extscript.c index 1d97ac0..d060d57 100644 --- a/src/cmd_neonserv_extscript.c +++ b/src/cmd_neonserv_extscript.c @@ -1,5 +1,5 @@ -/* cmd_neonserv_extscript.c - NeonServ v5.2 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* cmd_neonserv_extscript.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,6 +16,7 @@ */ #include "cmd_neonserv.h" +#include /* * argv[0] 'toys' if it's a toy command (check if toys are enabled) @@ -23,6 +24,17 @@ * argv[argc-1] all arguments passed to the command */ +static TIMEQ_CALLBACK(neonserv_cmd_extscript_callback); + +struct neonserv_cmd_extscript_cache { + struct ClientSocket *client, *textclient; + struct Event *event; + struct UserNode *user; + struct ChanNode *chan; + int answere_channel; + FILE *pipe; +}; + CMD_BIND(neonserv_cmd_extscript) { int i, j; char *args[MAXNUMPARAMS]; @@ -111,38 +123,48 @@ CMD_BIND(neonserv_cmd_extscript) { } command[commandpos] = '\0'; //we should now have a valid 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!"); + + struct neonserv_cmd_extscript_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->event = event; + cache->user = user; + cache->chan = chan; + cache->answere_channel = answere_channel; + cache->pipe = popen(command, "r"); + #ifndef WIN32 + fcntl(fileno(cache->pipe), F_SETFL, O_NONBLOCK); + #endif + timeq_add(1, neonserv_cmd_extscript_callback, cache); +} + +static TIMEQ_CALLBACK(neonserv_cmd_extscript_callback) { + struct neonserv_cmd_extscript_cache *cache = data; + char command[512]; + char *a; + if(feof(cache->pipe)) { + pclose(cache->pipe); + free(cache); + return; + } + while (fgets(command, 512, cache->pipe) != NULL) { + if((a = strchr(command, '\n'))) + *a = '\0'; + if(!stricmp(command, "/log")) { + logEvent(cache->event); + continue; } - #ifndef WIN32 - exit(EXIT_FAILURE); - } else if (pID < 0) { - reply(getTextBot(), user, "internal bot error - please contact an administrator!"); - } else { - //parent bot - continue program - wait(NULL); + if(cache->answere_channel) + putsock(cache->client, "PRIVMSG %s :%s", cache->chan->name, command); + else + reply(cache->textclient, cache->user, "%s", command); } - #endif + timeq_add(1, neonserv_cmd_extscript_callback, cache); } + +