]> git.ipfire.org Git - ipfire-2.x.git/blame - src/install+setup/libsmooth/main.c
Install-Initrd finalisiert..
[ipfire-2.x.git] / src / install+setup / libsmooth / main.c
CommitLineData
cd1a2927
MT
1/* SmoothWall libsmooth.\r
2 *\r
3 * This program is distributed under the terms of the GNU General Public\r
4 * Licence. See the file COPYING for details.\r
5 *\r
6 * (c) Lawrence Manning, 2001\r
7 * Contains library functions.\r
8 * \r
9 * $Id: main.c,v 1.6.2.9 2005/12/09 22:31:41 franck78 Exp $\r
10 * \r
11 */\r
12 \r
13#include "libsmooth.h"\r
14\r
15extern FILE *flog;\r
16extern char *mylog;\r
17\r
18extern char **ctr;\r
19 \r
20/* reboot(). reboots. */\r
21void reboot(void)\r
22{\r
23 mysystem("/etc/halt");\r
24}\r
25\r
26/* stripnl(). Replaces \n with \0 */\r
27void stripnl(char *s)\r
28{\r
29 char *t = strchr(s, '\n');\r
30 if (t) *t = '\0';\r
31}\r
32\r
33/* Little wrapper. */\r
34int mysystem(char *command)\r
35{\r
36 char mycommand[STRING_SIZE];\r
37 \r
38 snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);\r
39 fprintf(flog, "Running command: %s\n", command);\r
40 return system(mycommand);\r
41}\r
42\r
43void errorbox(char *message)\r
44{\r
45 newtWinMessage(ctr[TR_ERROR], ctr[TR_OK], message);\r
46}\r
47\r
48void statuswindow(int width, int height, char *title, char *text, ...)\r
49{\r
50 newtComponent t, f;\r
51 char *buf = NULL;\r
52 int size = 0;\r
53 int i = 0;\r
54 va_list args;\r
55\r
56 va_start(args, text);\r
57\r
58 do {\r
59 size += 1000;\r
60 if (buf) free(buf);\r
61 buf = malloc(size);\r
62 i = vsnprintf(buf, size, text, args);\r
63 } while (i == size);\r
64\r
65 va_end(args);\r
66\r
67 newtCenteredWindow(width, height, title);\r
68\r
69 t = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP);\r
70 newtTextboxSetText(t, buf);\r
71 f = newtForm(NULL, NULL, 0);\r
72\r
73 free(buf);\r
74\r
75 newtFormAddComponent(f, t);\r
76\r
77 newtDrawForm(f);\r
78 newtRefresh();\r
79 newtFormDestroy(f);\r
80}\r
81\r
82int runcommandwithstatus(char *command, char *message)\r
83{\r
84 int rc;\r
85 char title[STRING_SIZE];\r
86 \r
87 sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
88 statuswindow(60, 4, title, message);\r
89 rc = mysystem(command);\r
90 newtPopWindow();\r
91 \r
92 return rc;\r
93}\r
94\r
95int runhiddencommandwithstatus(char *command, char *message)\r
96{\r
97 int rc;\r
98 char title[STRING_SIZE];\r
99 char mycommand[STRING_SIZE];\r
100 \r
101 sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
102 statuswindow(60, 4, title, message);\r
103 snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);\r
104 fprintf(flog, "Running command: ***** HIDDEN *****\n");\r
105 rc = system(mycommand);\r
106 newtPopWindow();\r
107 \r
108 return rc;\r
109}\r
110\r
111/* This one borrowed from redhat installer. */\r
112int runcommandwithprogress(int width, int height, char *title, char *command,\r
113 int lines, char *text, ...)\r
114{\r
115 newtComponent t, f, s;\r
116 char *buf = NULL;\r
117 int size = 0;\r
118 int i = 0;\r
119 va_list args;\r
120 int rc = 0;\r
121 FILE *p;\r
122 char buffer[STRING_SIZE];\r
123 int progress = 0;\r
124 char mycommand[STRING_SIZE];\r
125\r
126 va_start(args, text);\r
127\r
128 do {\r
129 size += 1000;\r
130 if (buf) free(buf);\r
131 buf = malloc(size);\r
132 i = vsnprintf(buf, size, text, args);\r
133 } while (i == size);\r
134\r
135 va_end(args);\r
136\r
137 newtCenteredWindow(width, height, title);\r
138\r
139 t = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP);\r
140 newtTextboxSetText(t, buf);\r
141 f = newtForm(NULL, NULL, 0);\r
142\r
143 free(buf);\r
144\r
145 newtFormAddComponent(f, t);\r
146 \r
147 s = newtScale(1, 3, width - 2, lines);\r
148 newtScaleSet(s, progress);\r
149 \r
150 newtFormAddComponent(f, s);\r
151\r
152 newtDrawForm(f);\r
153 newtRefresh();\r
154 \r
155 snprintf(mycommand, STRING_SIZE, "%s 2>>%s", command, mylog);\r
156 fprintf(flog, "Running command: %s\n", command);\r
157 \r
158 if (!(p = popen(command, "r")))\r
159 {\r
160 rc = 1;\r
161 goto EXIT;\r
162 }\r
163 setvbuf(p, NULL, _IOLBF, 255);\r
164 \r
165 while (fgets(buffer, STRING_SIZE, p))\r
166 {\r
167 newtScaleSet(s, ++progress);\r
168 newtRefresh(); \r
169 fprintf(flog, "%s", buffer);\r
170 }\r
171 \r
172 rc = pclose(p);\r
173 \r
174EXIT:\r
175 newtFormDestroy(f);\r
176 newtPopWindow();\r
177 \r
178 return rc;\r
179}\r
180\r
181int checkformodule(char *module)\r
182{\r
183 FILE *file;\r
184 char buffer[STRING_SIZE];\r
185 int result = 0;\r
186 \r
187 if (!(file = fopen("/proc/modules", "r")))\r
188 {\r
189 fprintf(flog, "Unable to open /proc/modules in checkformodule()\n");\r
190 return 0;\r
191 }\r
192 \r
193 while (fgets(buffer, STRING_SIZE, file))\r
194 {\r
195 if (strncmp(buffer, module, strlen(module)) == 0)\r
196 {\r
197 if (buffer[strlen(module)] == ' ')\r
198 {\r
199 result = 1;\r
200 goto EXIT;\r
201 }\r
202 }\r
203 }\r
204 \r
205EXIT:\r
206 fclose(file);\r
207 \r
208 return result;\r
209} \r
210 \r
211int _replace_string(char string[], char *from, char *to)\r
212{\r
213 int fromlen = strlen(from);\r
214 int tolen = strlen(to);\r
215 char *start, *p1, *p2;\r
216 for(start = string; *start != '\0'; start++)\r
217 {\r
218 p1 = from;\r
219 p2 = start;\r
220 while(*p1 != '\0')\r
221 {\r
222 if(*p1 != *p2)\r
223 break;\r
224 p1++;\r
225 p2++;\r
226 }\r
227 if(*p1 == '\0')\r
228 {\r
229 if(fromlen != tolen)\r
230 {\r
231 memmove(start + tolen, start + fromlen,\r
232 strlen(start + fromlen) + 1);\r
233 }\r
234 for(p1 = to; *p1 != '\0'; p1++)\r
235 *start++ = *p1;\r
236 return 1;\r
237 }\r
238 }\r
239 return 0;\r
240}\r
241\r
242int replace(char filename1[], char *from, char *to)\r
243{\r
244 FILE *file1, *file2;\r
245 char filename2[1000];\r
246 char temp[1000];\r
247 int ret = 0;\r
248\r
249 /* Open the source and destination files */\r
250 strcpy (filename2, filename1);\r
251 strcat (filename2, ".new");\r
252 if (!(file1 = fopen (filename1, "r"))) return 1;\r
253 if (!(file2 = fopen (filename2, "w"))) {\r
254 fclose(file1);\r
255 return -1;\r
256 }\r
257\r
258 /* Start reading in lines */\r
259 while (fgets (temp, 1000, file1) != NULL) {\r
260\r
261 if (strlen(to) > 0) {\r
262 /* Replace string */\r
263 ret = _replace_string (temp, from, to);\r
264 \r
265 /* Write string to new file */\r
266 fputs(temp, file2);\r
267 } else {\r
268 /* Remove string when to is NULL */\r
269 if (!strstr(temp, from)) \r
270 fputs(temp, file2);\r
271 }\r
272 }\r
273\r
274 /* Close source and destination */\r
275 fclose (file1);\r
276 fclose (file2);\r
277\r
278 /* Move the file */\r
279 rename (filename2, filename1);\r
280 \r
281 return (ret);\r
282}\r
283\r
284/* Include enabled languages */\r
285#ifdef LANG_EN_ONLY\r
286 #include "lang_en.c"\r
1217aa01 287#elifdef LANG_ALL\r
cd1a2927
MT
288 #include "lang_bz.c"\r
289 #include "lang_cs.c"\r
290 #include "lang_da.c"\r
291 #include "lang_de.c"\r
292 #include "lang_en.c"\r
293 #include "lang_es.c"\r
294 #include "lang_fi.c"\r
295 #include "lang_fr.c"\r
296 #include "lang_el.c"\r
297 #include "lang_it.c"\r
298 #include "lang_hu.c"\r
299 #include "lang_la.c"\r
300 #include "lang_nl.c"\r
301 #include "lang_no.c"\r
302 #include "lang_pl.c"\r
303 #include "lang_pt.c"\r
304 #include "lang_sk.c"\r
305 #include "lang_so.c"\r
306 #include "lang_sv.c"\r
307 #include "lang_tr.c"\r
308 #include "lang_vi.c"\r
1217aa01
HS
309#else\r
310 #include "lang_de.c"\r
311 #include "lang_en.c"\r
cd1a2927
MT
312\r
313#endif\r
314// returns a pointer to the actual running version number of IPCop.\r
315// Successive updates increase effective version but not VERSION !\r
316char g_title[STRING_SIZE] = "";\r
317char* get_version(void) {\r
318 FILE *f_title;\r
319 if ((f_title = fopen ("/etc/issue", "r"))) {\r
320 fgets (g_title, STRING_SIZE, f_title);\r
321 fclose (f_title);\r
322 if (g_title[strlen(g_title) - 1] == '\n') g_title[strlen(g_title) - 1] = '\0';\r
323 } else {\r
324 sprintf (g_title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
325 }\r
326 return g_title;\r
327}\r