Shim now knows about whitespace in quoted path names. The default
[olsrd.git] / gui / win32 / Shim / shim.c
1 /*\r
2  * Windows GUI for olsr.org\r
3  * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)\r
4  *\r
5  * This file is part of olsr.org.\r
6  *\r
7  * olsr.org is free software; you can redistribute it and/or modify\r
8  * it under the terms of the GNU General Public License as published by\r
9  * the Free Software Foundation; either version 2 of the License, or\r
10  * (at your option) any later version.\r
11  *\r
12  * olsr.org is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  * GNU General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with olsr.org; if not, write to the Free Software\r
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
20  *\r
21  */\r
22 \r
23 #include <windows.h>\r
24 \r
25 void EntryPoint(void)\r
26 {\r
27         STARTUPINFO StartInfo;\r
28         PROCESS_INFORMATION ProcInfo;\r
29         int i;\r
30         char *CmdLine;\r
31         char *Walker;\r
32         char NewCmdLine[MAX_PATH + 500];\r
33         HANDLE Handles[2];\r
34         unsigned long Res;\r
35         int Quotes;\r
36 \r
37         Handles[0] = OpenEvent(EVENT_ALL_ACCESS, FALSE, "TheOlsrdShimEvent");\r
38 \r
39         if (Handles[0] == NULL)\r
40         {\r
41                 MessageBox(NULL, "Cannot open event.", "Shim Error", MB_ICONERROR | MB_OK);\r
42                 ExitProcess(1);\r
43         }\r
44 \r
45         CmdLine = GetCommandLine();\r
46 \r
47         Quotes = 0;\r
48         \r
49         while (*CmdLine != 0)\r
50         {\r
51                 if (*CmdLine == '"')\r
52                         Quotes = !Quotes;\r
53 \r
54                 else if (*CmdLine == ' ' && !Quotes)\r
55                         break;\r
56 \r
57                 CmdLine++;\r
58         }\r
59 \r
60         if (*CmdLine == 0)\r
61         {\r
62                 MessageBox(NULL, "Missing arguments.", "Shim Error", MB_ICONERROR | MB_OK);\r
63                 ExitProcess(1);\r
64         }\r
65 \r
66         GetModuleFileName(NULL, NewCmdLine, MAX_PATH);\r
67 \r
68         for (Walker = NewCmdLine; *Walker != 0; Walker++);\r
69 \r
70         while (*Walker != '\\')\r
71                 Walker--;\r
72 \r
73         Walker[1] = 'o';\r
74         Walker[2] = 'l';\r
75         Walker[3] = 's';\r
76         Walker[4] = 'r';\r
77         Walker[5] = 'd';\r
78         Walker[6] = '.';\r
79         Walker[7] = 'e';\r
80         Walker[8] = 'x';\r
81         Walker[9] = 'e';\r
82 \r
83         Walker[10] = ' ';\r
84 \r
85         Walker += 11;\r
86 \r
87         while ((*Walker++ = *CmdLine++) != 0);\r
88 \r
89         for (i = 0; i < sizeof (STARTUPINFO); i++)\r
90                 ((char *)&StartInfo)[i] = 0;\r
91 \r
92         StartInfo.cb = sizeof (STARTUPINFO);\r
93 \r
94         if (!CreateProcess(NULL, NewCmdLine, NULL, NULL, TRUE,\r
95                 CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartInfo, &ProcInfo))\r
96         {\r
97                 MessageBox(NULL, "Cannot execute OLSR server.", "Shim Error", MB_ICONERROR | MB_OK);\r
98                 ExitProcess(1);\r
99         }\r
100 \r
101         Handles[1] = ProcInfo.hProcess;\r
102 \r
103         Res = WaitForMultipleObjects(2, Handles, FALSE, INFINITE);\r
104 \r
105         if (Res == WAIT_OBJECT_0)\r
106         {\r
107                 GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, ProcInfo.dwProcessId);\r
108                 WaitForSingleObject(ProcInfo.hProcess, INFINITE);\r
109         }\r
110         \r
111         CloseHandle(ProcInfo.hThread);\r
112         CloseHandle(ProcInfo.hProcess);\r
113 \r
114         ExitProcess(0);\r
115 }\r