diff options
author | Jeremy Katz <katzj@redhat.com> | 2002-11-26 19:59:19 +0000 |
---|---|---|
committer | Jeremy Katz <katzj@redhat.com> | 2002-11-26 19:59:19 +0000 |
commit | 32d18cdb5603ba71a27661cc59d78bfaf43a36cc (patch) | |
tree | cbef628263c93aba4f3dbb99573f0dc538db714f /loader2/moduledeps.c | |
parent | 48ad552b63a95aec286aba9cd91ec0a745152e95 (diff) | |
download | anaconda-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.c | 133 |
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; +} |