summaryrefslogtreecommitdiffstats
path: root/mdk-stage1
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1')
-rw-r--r--mdk-stage1/Makefile2
-rw-r--r--mdk-stage1/adsl.c2
-rw-r--r--mdk-stage1/automatic.c1
-rw-r--r--mdk-stage1/cdrom.c2
-rw-r--r--mdk-stage1/dhcp.c2
-rw-r--r--mdk-stage1/directory.c2
-rw-r--r--mdk-stage1/disk.c2
-rw-r--r--mdk-stage1/modules.c1
-rw-r--r--mdk-stage1/mount.c1
-rw-r--r--mdk-stage1/network.c2
-rw-r--r--mdk-stage1/params.c174
-rw-r--r--mdk-stage1/params.h31
-rw-r--r--mdk-stage1/probing.c1
-rw-r--r--mdk-stage1/rescue-gui.c2
-rw-r--r--mdk-stage1/stage1.c1
-rw-r--r--mdk-stage1/stage1.h2
-rw-r--r--mdk-stage1/thirdparty.c2
-rw-r--r--mdk-stage1/tools.c288
-rw-r--r--mdk-stage1/tools.h26
-rw-r--r--mdk-stage1/url.c1
-rw-r--r--mdk-stage1/utils.c157
-rw-r--r--mdk-stage1/utils.h34
-rw-r--r--mdk-stage1/wireless.c1
23 files changed, 421 insertions, 316 deletions
diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile
index 607c7bd40..c7a9a92e9 100644
--- a/mdk-stage1/Makefile
+++ b/mdk-stage1/Makefile
@@ -104,7 +104,7 @@ STAGE1_NETWORK_LIBS = /usr/$(LIB)/libresolv.a
endif
#- stage1 itself
-STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c lomount.c thirdparty.c zlibsupport.c
+STAGE1SRC = stage1.c log.c utils.c params.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c lomount.c thirdparty.c zlibsupport.c
CDROMSRC = cdrom.c
DISKSRC = disk.c directory.c partition.c
NETWORKSRC = network.c nfsmount.c dhcp.c url.c dns.c adsl.c directory.c wireless.c
diff --git a/mdk-stage1/adsl.c b/mdk-stage1/adsl.c
index 595b3fae0..03eeeb9a9 100644
--- a/mdk-stage1/adsl.c
+++ b/mdk-stage1/adsl.c
@@ -31,7 +31,7 @@
#include "log.h"
#include "network.h"
#include "modules.h"
-#include "tools.h"
+#include "utils.h"
#include "frontend.h"
#include "automatic.h"
diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c
index 3a816bab1..e5c909624 100644
--- a/mdk-stage1/automatic.c
+++ b/mdk-stage1/automatic.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include "tools.h"
+#include "utils.h"
#include "stage1.h"
#include "frontend.h"
#include "log.h"
diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c
index 199b1d830..3657fcf4f 100644
--- a/mdk-stage1/cdrom.c
+++ b/mdk-stage1/cdrom.c
@@ -30,6 +30,8 @@
#include "probing.h"
#include "log.h"
#include "mount.h"
+#include "tools.h"
+#include "utils.h"
#include "cdrom.h"
diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c
index f5de6543e..fccb400e1 100644
--- a/mdk-stage1/dhcp.c
+++ b/mdk-stage1/dhcp.c
@@ -45,6 +45,8 @@
#include "stage1.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "network.h"
#include "frontend.h"
#include "automatic.h"
diff --git a/mdk-stage1/directory.c b/mdk-stage1/directory.c
index 6957efbda..3c644f379 100644
--- a/mdk-stage1/directory.c
+++ b/mdk-stage1/directory.c
@@ -28,6 +28,8 @@
#include "stage1.h"
#include "frontend.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "lomount.h"
char * extract_list_directory(char * direct)
diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c
index 4b85347f5..0fa789d91 100644
--- a/mdk-stage1/disk.c
+++ b/mdk-stage1/disk.c
@@ -33,6 +33,8 @@
#include "modules.h"
#include "probing.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "mount.h"
#include "automatic.h"
#include "directory.h"
diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c
index 43120bc4f..48fc20afd 100644
--- a/mdk-stage1/modules.c
+++ b/mdk-stage1/modules.c
@@ -29,6 +29,7 @@
#include <errno.h>
#include "stage1.h"
#include "log.h"
+#include "utils.h"
#include "frontend.h"
#include "mount.h"
#include "modules_descr.h"
diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c
index 71d6f111f..41fbb99f2 100644
--- a/mdk-stage1/mount.c
+++ b/mdk-stage1/mount.c
@@ -27,6 +27,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include "log.h"
+#include "utils.h"
#include "modules.h"
#include "mount.h"
diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c
index 9232684d0..6959fcbc8 100644
--- a/mdk-stage1/network.c
+++ b/mdk-stage1/network.c
@@ -40,6 +40,8 @@
#include "modules.h"
#include "probing.h"
#include "log.h"
+#include "tools.h"
+#include "utils.h"
#include "mount.h"
#include "automatic.h"
#include "dhcp.h"
diff --git a/mdk-stage1/params.c b/mdk-stage1/params.c
new file mode 100644
index 000000000..311f8b0ea
--- /dev/null
+++ b/mdk-stage1/params.c
@@ -0,0 +1,174 @@
+/*
+ * Guillaume Cottenceau (gc@mandrakesoft.com)
+ *
+ * Copyright 2000 Mandrakesoft
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "params.h"
+#include "utils.h"
+#include "automatic.h"
+#include "log.h"
+#include "bootsplash.h"
+
+static struct param_elem params[50];
+static int param_number = 0;
+
+void process_cmdline(void)
+{
+ char buf[512];
+ int size, i;
+ int fd = -1;
+
+ if (IS_TESTING) {
+ log_message("TESTING: opening cmdline... ");
+
+ if ((fd = open("cmdline", O_RDONLY)) == -1)
+ log_message("TESTING: could not open cmdline");
+ }
+
+ if (fd == -1) {
+ log_message("opening /proc/cmdline... ");
+
+ if ((fd = open("/proc/cmdline", O_RDONLY)) == -1)
+ fatal_error("could not open /proc/cmdline");
+ }
+
+ size = read(fd, buf, sizeof(buf));
+ buf[size-1] = '\0'; // -1 to eat the \n
+ close(fd);
+
+ log_message("\t%s", buf);
+
+ i = 0;
+ while (buf[i] != '\0') {
+ char *name, *value = NULL;
+ int j = i;
+ while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0')
+ i++;
+ if (i == j) {
+ i++;
+ continue;
+ }
+ name = memdup(&buf[j], i-j + 1);
+ name[i-j] = '\0';
+
+ if (buf[i] == '=') {
+ int k = i+1;
+ i++;
+ while (buf[i] != ' ' && buf[i] != '\0')
+ i++;
+ value = memdup(&buf[k], i-k + 1);
+ value[i-k] = '\0';
+ }
+
+ params[param_number].name = name;
+ params[param_number].value = value;
+ param_number++;
+ if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK);
+ if (!strcmp(name, "updatemodules") ||
+ !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY);
+ if (!strcmp(name, "rescue")) set_param(MODE_RESCUE);
+ if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED);
+ if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO);
+ if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO);
+ if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1);
+ if (!strcmp(name, "automatic")) {
+ set_param(MODE_AUTOMATIC);
+ grab_automatic_params(value);
+ }
+ if (buf[i] == '\0')
+ break;
+ i++;
+ }
+
+ if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) {
+ set_param(MODE_THIRDPARTY);
+ }
+
+ log_message("\tgot %d args", param_number);
+}
+
+
+int stage1_mode = 0;
+
+int get_param(int i)
+{
+#ifdef SPAWN_INTERACTIVE
+ static int fd = 0;
+ char buf[5000];
+ char * ptr;
+ int nb;
+
+ if (fd <= 0) {
+ fd = open(interactive_fifo, O_RDONLY);
+ if (fd == -1)
+ return (stage1_mode & i);
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+ }
+
+ if (fd > 0) {
+ if ((nb = read(fd, buf, sizeof(buf))) > 0) {
+ buf[nb] = '\0';
+ ptr = buf;
+ while ((ptr = strstr(ptr, "+ "))) {
+ if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE);
+ ptr++;
+ }
+ ptr = buf;
+ while ((ptr = strstr(ptr, "- "))) {
+ if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE);
+ ptr++;
+ }
+ }
+ }
+#endif
+
+ return (stage1_mode & i);
+}
+
+char * get_param_valued(char *param_name)
+{
+ int i;
+ for (i = 0; i < param_number ; i++)
+ if (!strcmp(params[i].name, param_name))
+ return params[i].value;
+
+ return NULL;
+}
+
+void set_param_valued(char *param_name, char *param_value)
+{
+ params[param_number].name = param_name;
+ params[param_number].value = param_value;
+ param_number++;
+}
+
+void set_param(int i)
+{
+ stage1_mode |= i;
+}
+
+void unset_param(int i)
+{
+ stage1_mode &= ~i;
+}
+
+void unset_automatic(void)
+{
+ log_message("unsetting automatic");
+ unset_param(MODE_AUTOMATIC);
+ exit_bootsplash();
+}
diff --git a/mdk-stage1/params.h b/mdk-stage1/params.h
new file mode 100644
index 000000000..2fe624143
--- /dev/null
+++ b/mdk-stage1/params.h
@@ -0,0 +1,31 @@
+/*
+ * Guillaume Cottenceau (gc@mandrakesoft.com)
+ *
+ * Copyright 2000 Mandrakesoft
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _PARAMS_H_
+#define _PARAMS_H_
+
+void process_cmdline(void);
+int get_param(int i);
+char * get_param_valued(char *param_name);
+void set_param(int i);
+void unset_param(int i);
+void unset_automatic(void);
+
+struct param_elem
+{
+ char * name;
+ char * value;
+};
+
+#endif
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 803c11806..841173e49 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -46,6 +46,7 @@
#include "stage1.h"
#include "log.h"
+#include "utils.h"
#include "frontend.h"
#include "modules.h"
#include "pci-resource/pci-ids.h"
diff --git a/mdk-stage1/rescue-gui.c b/mdk-stage1/rescue-gui.c
index be63229e8..f0d24d56a 100644
--- a/mdk-stage1/rescue-gui.c
+++ b/mdk-stage1/rescue-gui.c
@@ -30,7 +30,7 @@
#include "config-stage1.h"
#include "frontend.h"
-#include "tools.h"
+#include "utils.h"
#if defined(__i386__) || defined(__x86_64__)
#define ENABLE_RESCUE_MS_BOOT 1
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index 41456cc5c..505bf655c 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -42,6 +42,7 @@
#include "frontend.h"
#include "modules.h"
#include "tools.h"
+#include "utils.h"
#include "automatic.h"
#include "mount.h"
#include "thirdparty.h"
diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h
index b6ec98ef7..f21c6ab07 100644
--- a/mdk-stage1/stage1.h
+++ b/mdk-stage1/stage1.h
@@ -23,7 +23,7 @@
#define _STAGE1_H_
#include "config-stage1.h"
-#include "tools.h"
+#include "params.h"
/* Some global stuff */
diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c
index 8c73bd88e..dcdb77062 100644
--- a/mdk-stage1/thirdparty.c
+++ b/mdk-stage1/thirdparty.c
@@ -20,6 +20,8 @@
#include <sys/utsname.h>
#include "stage1.h"
+#include "tools.h"
+#include "utils.h"
#include "log.h"
#include "modules.h"
#include "mount.h"
diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c
index 5f30c78ae..e2e523e53 100644
--- a/mdk-stage1/tools.c
+++ b/mdk-stage1/tools.c
@@ -26,14 +26,12 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
-#include <ctype.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <sys/poll.h>
#include <errno.h>
-#include <sys/utsname.h>
#include <sys/ioctl.h>
#include <linux/fd.h>
#include "stage1.h"
@@ -43,194 +41,12 @@
#include "automatic.h"
#include "tools.h"
+#include "utils.h"
+#include "params.h"
#include "probing.h"
#include "modules.h"
#include "lomount.h"
-static struct param_elem params[50];
-static int param_number = 0;
-
-void process_cmdline(void)
-{
- char buf[512];
- int size, i;
- int fd = -1;
-
- if (IS_TESTING) {
- log_message("TESTING: opening cmdline... ");
-
- if ((fd = open("cmdline", O_RDONLY)) == -1)
- log_message("TESTING: could not open cmdline");
- }
-
- if (fd == -1) {
- log_message("opening /proc/cmdline... ");
-
- if ((fd = open("/proc/cmdline", O_RDONLY)) == -1)
- fatal_error("could not open /proc/cmdline");
- }
-
- size = read(fd, buf, sizeof(buf));
- buf[size-1] = '\0'; // -1 to eat the \n
- close(fd);
-
- log_message("\t%s", buf);
-
- i = 0;
- while (buf[i] != '\0') {
- char *name, *value = NULL;
- int j = i;
- while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0')
- i++;
- if (i == j) {
- i++;
- continue;
- }
- name = memdup(&buf[j], i-j + 1);
- name[i-j] = '\0';
-
- if (buf[i] == '=') {
- int k = i+1;
- i++;
- while (buf[i] != ' ' && buf[i] != '\0')
- i++;
- value = memdup(&buf[k], i-k + 1);
- value[i-k] = '\0';
- }
-
- params[param_number].name = name;
- params[param_number].value = value;
- param_number++;
- if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK);
- if (!strcmp(name, "updatemodules") ||
- !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY);
- if (!strcmp(name, "rescue")) set_param(MODE_RESCUE);
- if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED);
- if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO);
- if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO);
- if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1);
- if (!strcmp(name, "automatic")) {
- set_param(MODE_AUTOMATIC);
- grab_automatic_params(value);
- }
- if (buf[i] == '\0')
- break;
- i++;
- }
-
- if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) {
- set_param(MODE_THIRDPARTY);
- }
-
- log_message("\tgot %d args", param_number);
-}
-
-
-int stage1_mode = 0;
-
-int get_param(int i)
-{
-#ifdef SPAWN_INTERACTIVE
- static int fd = 0;
- char buf[5000];
- char * ptr;
- int nb;
-
- if (fd <= 0) {
- fd = open(interactive_fifo, O_RDONLY);
- if (fd == -1)
- return (stage1_mode & i);
- fcntl(fd, F_SETFL, O_NONBLOCK);
- }
-
- if (fd > 0) {
- if ((nb = read(fd, buf, sizeof(buf))) > 0) {
- buf[nb] = '\0';
- ptr = buf;
- while ((ptr = strstr(ptr, "+ "))) {
- if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE);
- ptr++;
- }
- ptr = buf;
- while ((ptr = strstr(ptr, "- "))) {
- if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE);
- ptr++;
- }
- }
- }
-#endif
-
- return (stage1_mode & i);
-}
-
-char * get_param_valued(char *param_name)
-{
- int i;
- for (i = 0; i < param_number ; i++)
- if (!strcmp(params[i].name, param_name))
- return params[i].value;
-
- return NULL;
-}
-
-void set_param_valued(char *param_name, char *param_value)
-{
- params[param_number].name = param_name;
- params[param_number].value = param_value;
- param_number++;
-}
-
-void set_param(int i)
-{
- stage1_mode |= i;
-}
-
-void unset_param(int i)
-{
- stage1_mode &= ~i;
-}
-
-void unset_automatic(void)
-{
- log_message("unsetting automatic");
- unset_param(MODE_AUTOMATIC);
- exit_bootsplash();
-}
-
-// warning, many things rely on the fact that:
-// - when failing it returns 0
-// - it stops on first non-digit char
-int charstar_to_int(const char * s)
-{
- int number = 0;
- while (*s && isdigit(*s)) {
- number = (number * 10) + (*s - '0');
- s++;
- }
- return number;
-}
-
-off_t file_size(const char * path)
-{
- struct stat statr;
- if (stat(path, &statr))
- return -1;
- else
- return statr.st_size;
-}
-
-int total_memory(void)
-{
- int value;
-
- /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */
- value = 4 * ((int)((float)file_size("/proc/kcore") / 1024 / 1024 / 4 + 0.5));
- log_message("Total Memory: %d Mbytes", value);
-
- return value;
-}
-
-
int image_has_stage2()
{
return access(COMPRESSED_FILE_REL(IMAGE_LOCATION "/"), R_OK) == 0 ||
@@ -431,70 +247,6 @@ enum return_type load_compressed_fd(int fd, int size)
return preload_mount_compressed_fd(fd, size, COMPRESSED_NAME(""), STAGE2_LOCATION);
}
-/* pixel's */
-void * memdup(void *src, size_t size)
-{
- void * r;
- r = malloc(size);
- memcpy(r, src, size);
- return r;
-}
-
-
-void add_to_env(char * name, char * value)
-{
- FILE* fakeenv = fopen("/tmp/env", "a");
- if (fakeenv) {
- char* e = asprintf_("%s=%s\n", name, value);
- fwrite(e, 1, strlen(e), fakeenv);
- free(e);
- fclose(fakeenv);
- } else
- log_message("couldn't fopen to fake env");
-}
-
-
-char ** list_directory(char * direct)
-{
- char * tmp[50000]; /* in /dev there can be many many files.. */
- int i = 0;
- struct dirent *ep;
- DIR *dp = opendir(direct);
- while (dp && (ep = readdir(dp))) {
- if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) {
- tmp[i] = strdup(ep->d_name);
- i++;
- }
- }
- if (dp)
- closedir(dp);
- tmp[i] = NULL;
- return memdup(tmp, sizeof(char*) * (i+1));
-}
-
-
-int string_array_length(char ** a)
-{
- int i = 0;
- if (!a)
- return -1;
- while (a && *a) {
- a++;
- i++;
- }
- return i;
-}
-
-int kernel_version(void)
-{
- struct utsname val;
- if (uname(&val)) {
- log_perror("uname failed");
- return -1;
- }
- return charstar_to_int(val.release + 2);
-}
-
int try_mount(char * dev, char * location)
{
char device_fullname[50];
@@ -585,39 +337,3 @@ char * floppy_device(void)
else
return "/dev/fd0";
}
-
-char * asprintf_(const char *msg, ...)
-{
- int n;
- char * s;
- char dummy;
- va_list arg_ptr;
- va_start(arg_ptr, msg);
- n = vsnprintf(&dummy, sizeof(dummy), msg, arg_ptr);
- va_start(arg_ptr, msg);
- if ((s = malloc(n + 1))) {
- vsnprintf(s, n + 1, msg, arg_ptr);
- va_end(arg_ptr);
- return s;
- }
- va_end(arg_ptr);
- return strdup("");
-}
-
-int scall_(int retval, char * msg, char * file, int line)
-{
- char tmp[5000];
- sprintf(tmp, "%s(%s:%d) failed", msg, file, line);
- if (retval)
- log_perror(tmp);
- return retval;
-}
-
-void lowercase(char *s)
-{
- int i = 0;
- while (s[i]) {
- s[i] = tolower(s[i]);
- i++;
- }
-}
diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h
index 78ed4b087..f8d9d4ee9 100644
--- a/mdk-stage1/tools.h
+++ b/mdk-stage1/tools.h
@@ -26,14 +26,6 @@
#include <stdlib.h>
#include "bootsplash.h"
-void process_cmdline(void);
-int get_param(int i);
-void set_param(int i);
-void unset_param(int i);
-void unset_automatic(void);
-int charstar_to_int(const char * s);
-off_t file_size(const char * path);
-int total_memory(void);
int image_has_stage2();
int ramdisk_possible(void);
enum return_type copy_file(char * from, char * to, void (*callback_func)(int overall));
@@ -44,11 +36,6 @@ enum return_type mount_compressed_image(char *compressed_image, char *location_
enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload);
enum return_type load_compressed_fd(int fd, int size);
enum return_type may_load_compressed_image(void);
-void * memdup(void *src, size_t size);
-void add_to_env(char * name, char * value);
-char ** list_directory(char * direct);
-int string_array_length(char ** a);
-int kernel_version(void);
int try_mount(char * dev, char * location);
#ifndef DISABLE_DISK
int get_disks(char *** names, char *** models);
@@ -57,18 +44,5 @@ int get_disks(char *** names, char *** models);
int get_cdroms(char *** names, char *** models);
#endif
char * floppy_device(void);
-char * asprintf_(const char *msg, ...);
-int scall_(int retval, char * msg, char * file, int line);
-#define scall(retval, msg) scall_(retval, msg, __FILE__, __LINE__)
-void lowercase(char *s);
-
-struct param_elem
-{
- char * name;
- char * value;
-};
-
-#define ptr_begins_static_str(pointer,static_str) (!strncmp(pointer,static_str,sizeof(static_str)-1))
-#define streq(a,b) (!strcmp(a,b))
#endif
diff --git a/mdk-stage1/url.c b/mdk-stage1/url.c
index 640825cf5..77233847e 100644
--- a/mdk-stage1/url.c
+++ b/mdk-stage1/url.c
@@ -46,6 +46,7 @@
#include "dns.h"
#include "log.h"
#include "tools.h"
+#include "utils.h"
#include "url.h"
diff --git a/mdk-stage1/utils.c b/mdk-stage1/utils.c
new file mode 100644
index 000000000..5e25c41ff
--- /dev/null
+++ b/mdk-stage1/utils.c
@@ -0,0 +1,157 @@
+/*
+ * Guillaume Cottenceau (gc@mandrakesoft.com)
+ *
+ * Copyright 2000 Mandrakesoft
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <sys/utsname.h>
+
+#include "utils.h"
+#include "log.h"
+
+// warning, many things rely on the fact that:
+// - when failing it returns 0
+// - it stops on first non-digit char
+int charstar_to_int(const char * s)
+{
+ int number = 0;
+ while (*s && isdigit(*s)) {
+ number = (number * 10) + (*s - '0');
+ s++;
+ }
+ return number;
+}
+
+off_t file_size(const char * path)
+{
+ struct stat statr;
+ if (stat(path, &statr))
+ return -1;
+ else
+ return statr.st_size;
+}
+
+int total_memory(void)
+{
+ int value;
+
+ /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */
+ value = 4 * ((int)((float)file_size("/proc/kcore") / 1024 / 1024 / 4 + 0.5));
+ log_message("Total Memory: %d Mbytes", value);
+
+ return value;
+}
+
+/* pixel's */
+void * memdup(void *src, size_t size)
+{
+ void * r;
+ r = malloc(size);
+ memcpy(r, src, size);
+ return r;
+}
+
+
+void add_to_env(char * name, char * value)
+{
+ FILE* fakeenv = fopen("/tmp/env", "a");
+ if (fakeenv) {
+ char* e = asprintf_("%s=%s\n", name, value);
+ fwrite(e, 1, strlen(e), fakeenv);
+ free(e);
+ fclose(fakeenv);
+ } else
+ log_message("couldn't fopen to fake env");
+}
+
+char ** list_directory(char * direct)
+{
+ char * tmp[50000]; /* in /dev there can be many many files.. */
+ int i = 0;
+ struct dirent *ep;
+ DIR *dp = opendir(direct);
+ while (dp && (ep = readdir(dp))) {
+ if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) {
+ tmp[i] = strdup(ep->d_name);
+ i++;
+ }
+ }
+ if (dp)
+ closedir(dp);
+ tmp[i] = NULL;
+ return memdup(tmp, sizeof(char*) * (i+1));
+}
+
+
+int string_array_length(char ** a)
+{
+ int i = 0;
+ if (!a)
+ return -1;
+ while (a && *a) {
+ a++;
+ i++;
+ }
+ return i;
+}
+
+int kernel_version(void)
+{
+ struct utsname val;
+ if (uname(&val)) {
+ log_perror("uname failed");
+ return -1;
+ }
+ return charstar_to_int(val.release + 2);
+}
+
+char * asprintf_(const char *msg, ...)
+{
+ int n;
+ char * s;
+ char dummy;
+ va_list arg_ptr;
+ va_start(arg_ptr, msg);
+ n = vsnprintf(&dummy, sizeof(dummy), msg, arg_ptr);
+ va_start(arg_ptr, msg);
+ if ((s = malloc(n + 1))) {
+ vsnprintf(s, n + 1, msg, arg_ptr);
+ va_end(arg_ptr);
+ return s;
+ }
+ va_end(arg_ptr);
+ return strdup("");
+}
+
+int scall_(int retval, char * msg, char * file, int line)
+{
+ char tmp[5000];
+ sprintf(tmp, "%s(%s:%d) failed", msg, file, line);
+ if (retval)
+ log_perror(tmp);
+ return retval;
+}
+
+void lowercase(char *s)
+{
+ int i = 0;
+ while (s[i]) {
+ s[i] = tolower(s[i]);
+ i++;
+ }
+}
diff --git a/mdk-stage1/utils.h b/mdk-stage1/utils.h
new file mode 100644
index 000000000..2f76109fc
--- /dev/null
+++ b/mdk-stage1/utils.h
@@ -0,0 +1,34 @@
+/*
+ * Guillaume Cottenceau (gc@mandrakesoft.com)
+ *
+ * Copyright 2000 Mandrakesoft
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * public license.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _UTILS_H_
+#define _UTILS_H_
+
+int charstar_to_int(const char * s);
+off_t file_size(const char * path);
+int total_memory(void);
+void * memdup(void *src, size_t size);
+void add_to_env(char * name, char * value);
+char ** list_directory(char * direct);
+int string_array_length(char ** a);
+int kernel_version(void);
+char * asprintf_(const char *msg, ...);
+int scall_(int retval, char * msg, char * file, int line);
+#define scall(retval, msg) scall_(retval, msg, __FILE__, __LINE__)
+void lowercase(char *s);
+
+#define ptr_begins_static_str(pointer,static_str) (!strncmp(pointer,static_str,sizeof(static_str)-1))
+#define streq(a,b) (!strcmp(a,b))
+
+#endif
diff --git a/mdk-stage1/wireless.c b/mdk-stage1/wireless.c
index cefe6c1f7..a362573bb 100644
--- a/mdk-stage1/wireless.c
+++ b/mdk-stage1/wireless.c
@@ -24,6 +24,7 @@
#include "automatic.h"
#include "stage1.h"
#include "log.h"
+#include "utils.h"
#include "wireless.h"
static int wireless_ioctl(int socket, const char *ifname, int request, struct iwreq *wrq);