summaryrefslogtreecommitdiffstats
path: root/loader2/moduledeps.c
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2002-11-26 19:59:19 +0000
committerJeremy Katz <katzj@redhat.com>2002-11-26 19:59:19 +0000
commit32d18cdb5603ba71a27661cc59d78bfaf43a36cc (patch)
treecbef628263c93aba4f3dbb99573f0dc538db714f /loader2/moduledeps.c
parent48ad552b63a95aec286aba9cd91ec0a745152e95 (diff)
downloadanaconda-32d18cdb5603ba71a27661cc59d78bfaf43a36cc.tar.gz
anaconda-32d18cdb5603ba71a27661cc59d78bfaf43a36cc.tar.xz
anaconda-32d18cdb5603ba71a27661cc59d78bfaf43a36cc.zip
restructuring and clean up of some of the older unused code in the loader.
still a lot to do, but this gets to stage2 for cd, nfs, http, and ftp booting from either the cd initrd or the pxe initrd
Diffstat (limited to 'loader2/moduledeps.c')
-rw-r--r--loader2/moduledeps.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/loader2/moduledeps.c b/loader2/moduledeps.c
new file mode 100644
index 000000000..287f31b84
--- /dev/null
+++ b/loader2/moduledeps.c
@@ -0,0 +1,133 @@
+/*
+ * moduledeps.c - module dependency determination
+ *
+ * Erik Troan <ewt@redhat.com>
+ * Matt Wilson <msw@redhat.com>
+ * Michael Fulbright <msf@redhat.com>
+ * Jeremy Katz <katzj@redhat.com>
+ *
+ * Copyright 1999 - 2002 Red Hat, Inc.
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * General 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 <alloca.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <newt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "moduledeps.h"
+
+moduleDeps mlNewDeps(void) {
+ moduleDeps md;
+
+ md = malloc(sizeof(*md));
+ md->name = NULL;
+ md->deps = NULL;
+
+ return md;
+}
+
+/* JKFIXME: if we have a new module with different deps, this doesn't
+ * handle it correctly */
+int mlLoadDeps(moduleDeps * moduleDepListPtr, const char * path) {
+ int fd;
+ char * buf;
+ struct stat sb;
+ char * start, * end, * chptr;
+ int i, numItems;
+ moduleDeps nextDep;
+ moduleDeps moduleDepList = *moduleDepListPtr;
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ return -1;
+ }
+
+ fstat(fd, &sb);
+ buf = alloca(sb.st_size + 1);
+ read(fd, buf, sb.st_size);
+ buf[sb.st_size] = '\0';
+ close(fd);
+
+ start = buf;
+ numItems = 0;
+ while (start) {
+ numItems++;
+ start = strchr(start + 1, '\n');
+ }
+
+ for (nextDep = moduleDepList; nextDep->name; nextDep++) numItems++;
+
+ moduleDepList = realloc(moduleDepList, sizeof(*moduleDepList) * numItems);
+ for (nextDep = moduleDepList; nextDep->name; nextDep++) ;
+
+ start = buf;
+ while (start < (buf + sb.st_size) && *start) {
+ end = strchr(start, '\n');
+ *end = '\0';
+
+ chptr = strchr(start, ':');
+ if (!chptr) {
+ start = end + 1;
+ continue;
+ }
+
+ *chptr++ = '\0';
+ while (*chptr && isspace(*chptr)) chptr++;
+ if (!*chptr) {
+ start = end + 1;
+ continue;
+ }
+
+ /* found something */
+ nextDep->name = strdup(start);
+ nextDep->deps = malloc(sizeof(char *) * (strlen(chptr) + 1));
+ start = chptr, i = 0;
+ while (start && *start) {
+ chptr = strchr(start, ' ');
+ if (chptr) *chptr = '\0';
+ nextDep->deps[i++] = strdup(start);
+ if (chptr)
+ start = chptr + 1;
+ else
+ start = NULL;
+ while (start && *start && isspace(*start)) start++;
+ }
+ nextDep->deps[i] = NULL;
+ nextDep->deps = realloc(nextDep->deps, sizeof(char *) * (i + 1));
+ nextDep++;
+
+ start = end + 1;
+ }
+
+ nextDep->name = NULL;
+ nextDep->deps = NULL;
+ moduleDepList = realloc(moduleDepList, sizeof(*moduleDepList) *
+ (nextDep - moduleDepList + 1));
+
+ *moduleDepListPtr = moduleDepList;
+
+ return 0;
+}
+
+char ** mlGetDeps(moduleDeps modDeps, const char * modName) {
+ moduleDeps dep;
+
+ for (dep = modDeps; dep && dep->name && strcmp(dep->name, modName); dep++);
+
+ if (dep) return dep->deps;
+
+ return NULL;
+}