184b149b6ff7009574ec527c62cfad48ed420473
[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 #include <windows.h>
43
44 int
45 main(int argc, char *argv[])
46 {
47   STARTUPINFO StartInfo;
48   PROCESS_INFORMATION ProcInfo;
49   int i;
50   char *CmdLine;
51   char *Walker;
52   char NewCmdLine[MAX_PATH + 500];
53   HANDLE Handles[2];
54   unsigned long Res;
55   int Quotes;
56
57   Handles[0] = OpenEvent(EVENT_ALL_ACCESS, FALSE, "TheOlsrdShimEvent");
58
59   if (Handles[0] == NULL) {
60     MessageBox(NULL, "Cannot open event.", "Shim Error", MB_ICONERROR | MB_OK);
61     ExitProcess(1);
62   }
63
64   CmdLine = GetCommandLine();
65
66   Quotes = 0;
67
68   while (*CmdLine != 0) {
69     if (*CmdLine == '"')
70       Quotes = !Quotes;
71
72     else if (*CmdLine == ' ' && !Quotes)
73       break;
74
75     CmdLine++;
76   }
77
78   if (*CmdLine == 0) {
79     MessageBox(NULL, "Missing arguments.", "Shim Error", MB_ICONERROR | MB_OK);
80     ExitProcess(1);
81   }
82
83   GetModuleFileName(NULL, NewCmdLine, MAX_PATH);
84
85   for (Walker = NewCmdLine; *Walker != 0; Walker++);
86
87   while (*Walker != '\\')
88     Walker--;
89
90   Walker[1] = 'o';
91   Walker[2] = 'l';
92   Walker[3] = 's';
93   Walker[4] = 'r';
94   Walker[5] = 'd';
95   Walker[6] = '.';
96   Walker[7] = 'e';
97   Walker[8] = 'x';
98   Walker[9] = 'e';
99
100   Walker[10] = ' ';
101
102   Walker += 11;
103
104   while ((*Walker++ = *CmdLine++) != 0);
105
106   for (i = 0; i < sizeof(STARTUPINFO); i++)
107     ((char *)&StartInfo)[i] = 0;
108
109   StartInfo.cb = sizeof(STARTUPINFO);
110
111   if (!CreateProcess(NULL, NewCmdLine, NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartInfo, &ProcInfo)) {
112     MessageBox(NULL, "Cannot execute OLSR server.", "Shim Error", MB_ICONERROR | MB_OK);
113     ExitProcess(1);
114   }
115
116   Handles[1] = ProcInfo.hProcess;
117
118   Res = WaitForMultipleObjects(2, Handles, FALSE, INFINITE);
119
120   if (Res == WAIT_OBJECT_0) {
121     GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, ProcInfo.dwProcessId);
122     WaitForSingleObject(ProcInfo.hProcess, INFINITE);
123   }
124
125   CloseHandle(ProcInfo.hThread);
126   CloseHandle(ProcInfo.hProcess);
127
128   ExitProcess(0);
129 }
130
131 /*
132  * Local Variables:
133  * c-basic-offset: 2
134  * indent-tabs-mode: nil
135  * End:
136  */