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