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