--- /dev/null
+/* SmoothWall libsmooth.\r
+ *\r
+ * This program is distributed under the terms of the GNU General Public\r
+ * Licence. See the file COPYING for details.\r
+ *\r
+ * (c) Lawrence Manning, 2001\r
+ * Contains library functions.\r
+ * \r
+ * $Id: main.c,v 1.6.2.9 2005/12/09 22:31:41 franck78 Exp $\r
+ * \r
+ */\r
+ \r
+#include "libsmooth.h"\r
+\r
+extern FILE *flog;\r
+extern char *mylog;\r
+\r
+extern char **ctr;\r
+ \r
+/* reboot(). reboots. */\r
+void reboot(void)\r
+{\r
+ mysystem("/etc/halt");\r
+}\r
+\r
+/* stripnl(). Replaces \n with \0 */\r
+void stripnl(char *s)\r
+{\r
+ char *t = strchr(s, '\n');\r
+ if (t) *t = '\0';\r
+}\r
+\r
+/* Little wrapper. */\r
+int mysystem(char *command)\r
+{\r
+ char mycommand[STRING_SIZE];\r
+ \r
+ snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);\r
+ fprintf(flog, "Running command: %s\n", command);\r
+ return system(mycommand);\r
+}\r
+\r
+void errorbox(char *message)\r
+{\r
+ newtWinMessage(ctr[TR_ERROR], ctr[TR_OK], message);\r
+}\r
+\r
+void statuswindow(int width, int height, char *title, char *text, ...)\r
+{\r
+ newtComponent t, f;\r
+ char *buf = NULL;\r
+ int size = 0;\r
+ int i = 0;\r
+ va_list args;\r
+\r
+ va_start(args, text);\r
+\r
+ do {\r
+ size += 1000;\r
+ if (buf) free(buf);\r
+ buf = malloc(size);\r
+ i = vsnprintf(buf, size, text, args);\r
+ } while (i == size);\r
+\r
+ va_end(args);\r
+\r
+ newtCenteredWindow(width, height, title);\r
+\r
+ t = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP);\r
+ newtTextboxSetText(t, buf);\r
+ f = newtForm(NULL, NULL, 0);\r
+\r
+ free(buf);\r
+\r
+ newtFormAddComponent(f, t);\r
+\r
+ newtDrawForm(f);\r
+ newtRefresh();\r
+ newtFormDestroy(f);\r
+}\r
+\r
+int runcommandwithstatus(char *command, char *message)\r
+{\r
+ int rc;\r
+ char title[STRING_SIZE];\r
+ \r
+ sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
+ statuswindow(60, 4, title, message);\r
+ rc = mysystem(command);\r
+ newtPopWindow();\r
+ \r
+ return rc;\r
+}\r
+\r
+int runhiddencommandwithstatus(char *command, char *message)\r
+{\r
+ int rc;\r
+ char title[STRING_SIZE];\r
+ char mycommand[STRING_SIZE];\r
+ \r
+ sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
+ statuswindow(60, 4, title, message);\r
+ snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);\r
+ fprintf(flog, "Running command: ***** HIDDEN *****\n");\r
+ rc = system(mycommand);\r
+ newtPopWindow();\r
+ \r
+ return rc;\r
+}\r
+\r
+/* This one borrowed from redhat installer. */\r
+int runcommandwithprogress(int width, int height, char *title, char *command,\r
+ int lines, char *text, ...)\r
+{\r
+ newtComponent t, f, s;\r
+ char *buf = NULL;\r
+ int size = 0;\r
+ int i = 0;\r
+ va_list args;\r
+ int rc = 0;\r
+ FILE *p;\r
+ char buffer[STRING_SIZE];\r
+ int progress = 0;\r
+ char mycommand[STRING_SIZE];\r
+\r
+ va_start(args, text);\r
+\r
+ do {\r
+ size += 1000;\r
+ if (buf) free(buf);\r
+ buf = malloc(size);\r
+ i = vsnprintf(buf, size, text, args);\r
+ } while (i == size);\r
+\r
+ va_end(args);\r
+\r
+ newtCenteredWindow(width, height, title);\r
+\r
+ t = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP);\r
+ newtTextboxSetText(t, buf);\r
+ f = newtForm(NULL, NULL, 0);\r
+\r
+ free(buf);\r
+\r
+ newtFormAddComponent(f, t);\r
+ \r
+ s = newtScale(1, 3, width - 2, lines);\r
+ newtScaleSet(s, progress);\r
+ \r
+ newtFormAddComponent(f, s);\r
+\r
+ newtDrawForm(f);\r
+ newtRefresh();\r
+ \r
+ snprintf(mycommand, STRING_SIZE, "%s 2>>%s", command, mylog);\r
+ fprintf(flog, "Running command: %s\n", command);\r
+ \r
+ if (!(p = popen(command, "r")))\r
+ {\r
+ rc = 1;\r
+ goto EXIT;\r
+ }\r
+ setvbuf(p, NULL, _IOLBF, 255);\r
+ \r
+ while (fgets(buffer, STRING_SIZE, p))\r
+ {\r
+ newtScaleSet(s, ++progress);\r
+ newtRefresh(); \r
+ fprintf(flog, "%s", buffer);\r
+ }\r
+ \r
+ rc = pclose(p);\r
+ \r
+EXIT:\r
+ newtFormDestroy(f);\r
+ newtPopWindow();\r
+ \r
+ return rc;\r
+}\r
+\r
+int checkformodule(char *module)\r
+{\r
+ FILE *file;\r
+ char buffer[STRING_SIZE];\r
+ int result = 0;\r
+ \r
+ if (!(file = fopen("/proc/modules", "r")))\r
+ {\r
+ fprintf(flog, "Unable to open /proc/modules in checkformodule()\n");\r
+ return 0;\r
+ }\r
+ \r
+ while (fgets(buffer, STRING_SIZE, file))\r
+ {\r
+ if (strncmp(buffer, module, strlen(module)) == 0)\r
+ {\r
+ if (buffer[strlen(module)] == ' ')\r
+ {\r
+ result = 1;\r
+ goto EXIT;\r
+ }\r
+ }\r
+ }\r
+ \r
+EXIT:\r
+ fclose(file);\r
+ \r
+ return result;\r
+} \r
+ \r
+int _replace_string(char string[], char *from, char *to)\r
+{\r
+ int fromlen = strlen(from);\r
+ int tolen = strlen(to);\r
+ char *start, *p1, *p2;\r
+ for(start = string; *start != '\0'; start++)\r
+ {\r
+ p1 = from;\r
+ p2 = start;\r
+ while(*p1 != '\0')\r
+ {\r
+ if(*p1 != *p2)\r
+ break;\r
+ p1++;\r
+ p2++;\r
+ }\r
+ if(*p1 == '\0')\r
+ {\r
+ if(fromlen != tolen)\r
+ {\r
+ memmove(start + tolen, start + fromlen,\r
+ strlen(start + fromlen) + 1);\r
+ }\r
+ for(p1 = to; *p1 != '\0'; p1++)\r
+ *start++ = *p1;\r
+ return 1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int replace(char filename1[], char *from, char *to)\r
+{\r
+ FILE *file1, *file2;\r
+ char filename2[1000];\r
+ char temp[1000];\r
+ int ret = 0;\r
+\r
+ /* Open the source and destination files */\r
+ strcpy (filename2, filename1);\r
+ strcat (filename2, ".new");\r
+ if (!(file1 = fopen (filename1, "r"))) return 1;\r
+ if (!(file2 = fopen (filename2, "w"))) {\r
+ fclose(file1);\r
+ return -1;\r
+ }\r
+\r
+ /* Start reading in lines */\r
+ while (fgets (temp, 1000, file1) != NULL) {\r
+\r
+ if (strlen(to) > 0) {\r
+ /* Replace string */\r
+ ret = _replace_string (temp, from, to);\r
+ \r
+ /* Write string to new file */\r
+ fputs(temp, file2);\r
+ } else {\r
+ /* Remove string when to is NULL */\r
+ if (!strstr(temp, from)) \r
+ fputs(temp, file2);\r
+ }\r
+ }\r
+\r
+ /* Close source and destination */\r
+ fclose (file1);\r
+ fclose (file2);\r
+\r
+ /* Move the file */\r
+ rename (filename2, filename1);\r
+ \r
+ return (ret);\r
+}\r
+\r
+/* Include enabled languages */\r
+#ifdef LANG_EN_ONLY\r
+ #include "lang_en.c"\r
+#else\r
+ #include "lang_bz.c"\r
+ #include "lang_cs.c"\r
+ #include "lang_da.c"\r
+ #include "lang_de.c"\r
+ #include "lang_en.c"\r
+ #include "lang_es.c"\r
+ #include "lang_fi.c"\r
+ #include "lang_fr.c"\r
+ #include "lang_el.c"\r
+ #include "lang_it.c"\r
+ #include "lang_hu.c"\r
+ #include "lang_la.c"\r
+ #include "lang_nl.c"\r
+ #include "lang_no.c"\r
+ #include "lang_pl.c"\r
+ #include "lang_pt.c"\r
+ #include "lang_sk.c"\r
+ #include "lang_so.c"\r
+ #include "lang_sv.c"\r
+ #include "lang_tr.c"\r
+ #include "lang_vi.c"\r
+\r
+#endif\r
+// returns a pointer to the actual running version number of IPCop.\r
+// Successive updates increase effective version but not VERSION !\r
+char g_title[STRING_SIZE] = "";\r
+char* get_version(void) {\r
+ FILE *f_title;\r
+ if ((f_title = fopen ("/etc/issue", "r"))) {\r
+ fgets (g_title, STRING_SIZE, f_title);\r
+ fclose (f_title);\r
+ if (g_title[strlen(g_title) - 1] == '\n') g_title[strlen(g_title) - 1] = '\0';\r
+ } else {\r
+ sprintf (g_title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
+ }\r
+ return g_title;\r
+}\r