diff --git a/plugins/exec/exec.c b/plugins/exec/exec.c new file mode 100644 index 00000000..1c8f5a06 --- /dev/null +++ b/plugins/exec/exec.c @@ -0,0 +1,197 @@ +/* XChat-WDK + * Copyright (c) 2011 Berke Viktor. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "xchat-plugin.h" + +static xchat_plugin *ph; /* plugin handle */ + + + + + + +/*static void +run_command (char *word[], char *word_eol[], void *userdata) +{ + char commandLine[1024]; + char buf[100]; + char buff1[256]; + DWORD dwRead,tdwRead,tdwAfail,tdwLeft, dwAvail, ctr = 0; + + HANDLE readPipe, writePipe; + STARTUPINFO sInfo; + PROCESS_INFORMATION pInfo; + BOOL res; + DWORD reDword; + + SECURITY_ATTRIBUTES secattr; + ZeroMemory(&secattr,sizeof(secattr)); + secattr.nLength = sizeof(secattr); + secattr.bInheritHandle = TRUE; + + xchat_printf (ph, "%d", strlen(word[2])); + if (strlen (word[2]) > 0) + { + strcpy (commandLine, "cmd.exe /c "); + strcat (commandLine, word_eol[2]); + + CreatePipe(&readPipe,&writePipe,&secattr,0); + + + ZeroMemory(&sInfo,sizeof(sInfo)); + ZeroMemory(&pInfo,sizeof(pInfo)); + sInfo.cb=sizeof(sInfo); + sInfo.dwFlags=STARTF_USESTDHANDLES; + sInfo.hStdInput=NULL; + sInfo.hStdOutput=writePipe; + sInfo.hStdError=writePipe; + + CreateProcess(0, commandLine, 0, 0, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, 0, 0, &sInfo, &pInfo); + CloseHandle(writePipe); + + //now read the output pipe here. + + //do + //{ + // res=ReadFile(readPipe,buf,100,&reDword,0); + //csTemp=buf; + //m_csOutput+=csTemp.Left(reDword); + //xchat_printf (ph, "%s", buf); + //strcpy(buf, "\0"); + //fflush(buf); + //}while(res); + + + while (PeekNamedPipe(readPipe, buff1, 1, &dwRead, &dwAvail, &tdwLeft)) + { + if (dwRead) + { + if (ReadFile(readPipe, buff1, sizeof(buff1) - 1, &dwRead, NULL) && dwRead != 0 ) + { + buff1[dwRead] = '\0'; + //cout << buff1; + xchat_printf (ph, "%s\n", buff1); + //cout.flush(); + //fflush(buff1); + //memset(&buff1[0], 0, sizeof(buff1)); + strcpy (buff1, ""); + } + } + } + } + + return XCHAT_EAT_ALL; + +}*/ + +static void +run_command (char *word[], char *word_eol[], void *userdata) +{ + return XCHAT_EAT_ALL; +} + + + + + + + + +/*static void +run_command (char *word[], char *word_eol[], void *userdata) +{ + STARTUPINFO si; + PROCESS_INFORMATION pi; + char commandLine[1024]; + HANDLE pipeWriter; + HANDLE pipeReader; + + char buff1[128]; + DWORD dwRead,tdwRead,tdwAfail,tdwLeft, dwAvail, ctr = 0; + + //CreatePipe (&pipeReader, &pipeWriter, NULL, NULL); + + ZeroMemory (&si, sizeof (si)); + si.cb = sizeof (si); + ZeroMemory (&pi, sizeof (pi)); + si.hStdOutput = pipeWriter; + + strcpy (commandLine, "cmd.exe /c "); + strcat (commandLine, word_eol[2]); + + if (!CreateProcess ( NULL, commandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + xchat_print (ph, "Error launching the Command Line!"); + } + + while (PeekNamedPipe(pipeReader, buff1, 1, &dwRead, &dwAvail, &tdwLeft)) { + if (dwRead) + { + if (ReadFile(pipeReader, buff1, sizeof(buff1) - 1, &dwRead, NULL) && dwRead != 0 ) + { + buff1[dwRead] = '\0'; + xchat_printf (ph, "%s\n", buff1); + //cout.flush(); + } + } + else + { + sprintf(buff1, "No data loop count = %d. Do something here\n", ++ctr); + xchat_printf (ph, "%s\n", buff1); + //cout.flush(); + SleepEx(1000, FALSE); + } + } + + CloseHandle (pipeWriter); + CloseHandle (pipeReader); + CloseHandle (pi.hProcess); + CloseHandle (pi.hThread); +}*/ + +int +xchat_plugin_init (xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) +{ + ph = plugin_handle; + + *plugin_name = "Exec"; + *plugin_desc = "Execute commands inside XChat"; + *plugin_version = "1.0"; + + xchat_hook_command (ph, "EXEC", XCHAT_PRI_NORM, run_command, 0, 0); + xchat_printf (ph, "Exec plugin loaded\n"); + + return 1; /* return 1 for success */ +} + +int +xchat_plugin_deinit (void) +{ + xchat_print (ph, "Exec plugin unloaded\n"); + return 1; +} diff --git a/plugins/exec/makefile.mak b/plugins/exec/makefile.mak new file mode 100644 index 00000000..d2153faf --- /dev/null +++ b/plugins/exec/makefile.mak @@ -0,0 +1,18 @@ +include "..\..\src\makeinc.mak" + +all: exec.obj exec.def + link $(LDFLAGS) $(LIBS) /dll /out:xcexec.dll /def:exec.def exec.obj + +exec.def: + echo EXPORTS > exec.def + echo xchat_plugin_init >> exec.def + echo xchat_plugin_deinit >> exec.def + +exec.obj: exec.c makefile.mak + cl $(CFLAGS) $(GLIB) /I.. exec.c + +clean: + del *.obj + del *.dll + del *.exp + del *.lib