BSD-style license.
[olsrd.git] / gui / win32 / Shim / shim.c
1 /*\r
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)\r
3  * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)\r
4  * All rights reserved.\r
5  *\r
6  * Redistribution and use in source and binary forms, with or without \r
7  * modification, are permitted provided that the following conditions \r
8  * are met:\r
9  *\r
10  * * Redistributions of source code must retain the above copyright \r
11  *   notice, this list of conditions and the following disclaimer.\r
12  * * Redistributions in binary form must reproduce the above copyright \r
13  *   notice, this list of conditions and the following disclaimer in \r
14  *   the documentation and/or other materials provided with the \r
15  *   distribution.\r
16  * * Neither the name of olsr.org, olsrd nor the names of its \r
17  *   contributors may be used to endorse or promote products derived \r
18  *   from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS \r
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE \r
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \r
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER \r
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT \r
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN \r
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
31  * POSSIBILITY OF SUCH DAMAGE.\r
32  *\r
33  * Visit http://www.olsr.org for more information.\r
34  *\r
35  * If you find this software useful feel free to make a donation\r
36  * to the project. For more information see the website or contact\r
37  * the copyright holders.\r
38  *\r
39  * $Id: shim.c,v 1.4 2004/11/21 01:21:10 tlopatic Exp $\r
40  */\r
41 \r
42 #include <windows.h>\r
43 \r
44 void EntryPoint(void)\r
45 {\r
46         STARTUPINFO StartInfo;\r
47         PROCESS_INFORMATION ProcInfo;\r
48         int i;\r
49         char *CmdLine;\r
50         char *Walker;\r
51         char NewCmdLine[MAX_PATH + 500];\r
52         HANDLE Handles[2];\r
53         unsigned long Res;\r
54         int Quotes;\r
55 \r
56         Handles[0] = OpenEvent(EVENT_ALL_ACCESS, FALSE, "TheOlsrdShimEvent");\r
57 \r
58         if (Handles[0] == NULL)\r
59         {\r
60                 MessageBox(NULL, "Cannot open event.", "Shim Error", MB_ICONERROR | MB_OK);\r
61                 ExitProcess(1);\r
62         }\r
63 \r
64         CmdLine = GetCommandLine();\r
65 \r
66         Quotes = 0;\r
67         \r
68         while (*CmdLine != 0)\r
69         {\r
70                 if (*CmdLine == '"')\r
71                         Quotes = !Quotes;\r
72 \r
73                 else if (*CmdLine == ' ' && !Quotes)\r
74                         break;\r
75 \r
76                 CmdLine++;\r
77         }\r
78 \r
79         if (*CmdLine == 0)\r
80         {\r
81                 MessageBox(NULL, "Missing arguments.", "Shim Error", MB_ICONERROR | MB_OK);\r
82                 ExitProcess(1);\r
83         }\r
84 \r
85         GetModuleFileName(NULL, NewCmdLine, MAX_PATH);\r
86 \r
87         for (Walker = NewCmdLine; *Walker != 0; Walker++);\r
88 \r
89         while (*Walker != '\\')\r
90                 Walker--;\r
91 \r
92         Walker[1] = 'o';\r
93         Walker[2] = 'l';\r
94         Walker[3] = 's';\r
95         Walker[4] = 'r';\r
96         Walker[5] = 'd';\r
97         Walker[6] = '.';\r
98         Walker[7] = 'e';\r
99         Walker[8] = 'x';\r
100         Walker[9] = 'e';\r
101 \r
102         Walker[10] = ' ';\r
103 \r
104         Walker += 11;\r
105 \r
106         while ((*Walker++ = *CmdLine++) != 0);\r
107 \r
108         for (i = 0; i < sizeof (STARTUPINFO); i++)\r
109                 ((char *)&StartInfo)[i] = 0;\r
110 \r
111         StartInfo.cb = sizeof (STARTUPINFO);\r
112 \r
113         if (!CreateProcess(NULL, NewCmdLine, NULL, NULL, TRUE,\r
114                 CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartInfo, &ProcInfo))\r
115         {\r
116                 MessageBox(NULL, "Cannot execute OLSR server.", "Shim Error", MB_ICONERROR | MB_OK);\r
117                 ExitProcess(1);\r
118         }\r
119 \r
120         Handles[1] = ProcInfo.hProcess;\r
121 \r
122         Res = WaitForMultipleObjects(2, Handles, FALSE, INFINITE);\r
123 \r
124         if (Res == WAIT_OBJECT_0)\r
125         {\r
126                 GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, ProcInfo.dwProcessId);\r
127                 WaitForSingleObject(ProcInfo.hProcess, INFINITE);\r
128         }\r
129         \r
130         CloseHandle(ProcInfo.hThread);\r
131         CloseHandle(ProcInfo.hProcess);\r
132 \r
133         ExitProcess(0);\r
134 }\r