diff --git a/src/distromatic.c b/src/distromatic.c index 6fc3f73..5789836 100644 --- a/src/distromatic.c +++ b/src/distromatic.c @@ -101,21 +101,10 @@ static int clearRecursionFlag(struct headerList *headerlist); static int resolveRecursiveDependencies( struct headerList *headerlist); -struct configTag* -findRepositoryByTag(const char *tag); - -static int read_configuration(const char *confFile, const char *tag); - int compareRequiredList(const void *ptr1, const void *ptr2); int handleObsoletedPackages(struct configTag *ct, int arch); -static struct configDefaults configdefaults; -static struct configTag *firstconfigtag = NULL, *configtag = NULL; - -static const unsigned int bufsize = 1024; -static const unsigned int maxlinelenght = 1024; - static const char *copyright[] = { PROGRAMNAME " version " PROGRAMVERSION, "Copyright (C) 2004-2013 by Silvan Calarco ", @@ -848,268 +837,6 @@ resolveRecursiveDependencies(struct headerList *headerlist) return 0; } -struct configTag* -findRepositoryByTag(const char *tag) -{ - struct configTag *ct = firstconfigtag; - - while ((ct) && (strncmp(ct->tag,tag,PATH_MAX))) ct = ct->next; - - if (ct) return ct; else return NULL; -} - -static int -read_configuration(const char *confFile, const char *tag) -{ - FILE *fin; - - char *vartok, *valuetok; - char input[maxlinelenght]; - char buf[bufsize]; - int i, j, curraltrep = 0; - - struct configTag *newconfigtag, *currconfigtag = NULL; - struct Packager *currmaintainer; - - if ((fin = fopen(confFile, "r")) == NULL) { - return 1; - } - - unsigned int configsection = 0; - configdefaults.html_basedir = NULL; - - configdefaults.arch[0] = DEFAULT_ARCH; - for (i = 1; itag = - (char *) strndup(&vartok[1], strlen(vartok) - 2); - newconfigtag->repository_dir = NULL; - newconfigtag->repository_source_dir = NULL; - curraltrep = 0; - for (i = 0; irepository[i] = NULL; - newconfigtag->html_dir = NULL; - newconfigtag->download_prefix = NULL; - newconfigtag->download_dir = NULL; - newconfigtag->showfile_prefix = NULL; - for (i = 0; iarch[i] = configdefaults.arch[i]; - newconfigtag->headerlist[i] = NULL; - newconfigtag->filetree[i]=NULL; - for (j = 0; jprovidedlist_idx[i][j]=NULL; - } - newconfigtag->configdefaults = &configdefaults; - newconfigtag->headersourcelist = NULL; - - if (configdefaults.html_basedir) { - strncpy(buf, configdefaults.html_basedir, bufsize); - strncat(buf, newconfigtag->tag, bufsize); - strncat(buf, "/", bufsize); - newconfigtag->html_dir = (char *) strdup(buf); - } - - if ((!tag) || (!strcmp(newconfigtag->tag, tag))) { - configtag = newconfigtag; - } - - if (!currconfigtag) { - firstconfigtag = newconfigtag; - } else { - currconfigtag->next = newconfigtag; - } - currconfigtag = newconfigtag; - } - } else if (configsection == CONF_REP_SECTION) { - /* we are reading inside a repository section... */ - if (!strcmp(vartok, "REPOSITORY_DIR")) { - currconfigtag->repository_dir = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "PARENT")) { - currconfigtag->repository[curraltrep]=findRepositoryByTag(valuetok); - if (!currconfigtag->repository[curraltrep]) { - fprintf(stderr,"Error: repository %s requested in %s was not previously configured; aborting.\n", - valuetok, currconfigtag->tag); - exit(1); - } - curraltrep++; - } else if (!strcmp(vartok, "HTML_DIR")) { - currconfigtag->html_dir = (char *) strdup(valuetok); - } else if (!strcmp(vartok, "DOWNLOAD_PREFIX")) { - currconfigtag->download_prefix = (char *) strdup(valuetok); - } else if (!strcmp(vartok, "DOWNLOAD_DIR")) { - currconfigtag->download_dir = (char *) strdup(valuetok); - } else if (!strcmp(vartok, "SHOWFILE_PREFIX")) { - currconfigtag->showfile_prefix = (char *) strdup(valuetok); - } else if (!strcmp(vartok, "REPOSITORY_SOURCE_DIR")) { - currconfigtag->repository_source_dir = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "DESCRIPTION")) { - currconfigtag->description = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "ARCHS")) { - vartok = (char *) strtok(valuetok, " "); - i = 0; - while ((vartok) && (i < ARCHS_MAX)) { - currconfigtag->arch[i] = malloc(sizeof vartok); - if (!currconfigtag->arch[i]) { - fprintf(stderr, "The system is out of memory\n"); - exit(1); - } - strcpy(currconfigtag->arch[i], vartok); - vartok = strtok(NULL, " "); - i++; - } - if (vartok) { - fprintf(stderr, - "Error: exceeding number of archs defined; maximum is %d.",ARCHS_MAX); - return 1; - } else { - currconfigtag->arch[i] = NULL; - } - } else { - fprintf(stderr, "Undefined token: %s\n", vartok); - return 1; - } - } else if (configsection == CONF_DEFAULTS_SECTION) { - /* we are in the default section */ - if (!strcmp(vartok, "HTML_BASEDIR")) { - configdefaults.html_basedir = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "DISTRIBUTION_NAME")) { - configdefaults.distribution_name = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "URL_ADDRESS")) { - configdefaults.url_address = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "URL_PREFIX")) { - configdefaults.url_prefix = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "URL_DIR")) { - configdefaults.url_dir = - (char *) strdup(valuetok); - } else if (!strcmp(vartok, "ARCHS")) { - vartok = (char *) strtok(valuetok, " "); - i = 0; - while ((vartok) && (i < ARCHS_MAX)) { - configdefaults.arch[i] = malloc(sizeof vartok); - if (!configdefaults.arch[i]) { - fprintf(stderr, "The system is out of memory\n"); - exit(1); - } - strcpy(configdefaults.arch[i], vartok); - vartok = strtok(NULL, " "); - i++; - } - if (vartok) { - fprintf(stderr, - "Error: exceeding number of archs defined; maximum is %d.",ARCHS_MAX); - return 1; - } - } else { - fprintf(stderr, - "Invalid token for `defaults' tag: %s\n", - vartok); - return 1; - } - } else if (configsection == CONF_MAINTAINERS_SECTION) { - - /* find or create maintainer */ - currmaintainer = getPackagerByName(vartok, 1); - - if (!currmaintainer) { - fprintf(stderr, - "Error: cannot create maintainers; aborting."); - return 1; - } - - currmaintainer->role |= PACKAGER_ROLE_MAINTAINER; - - vartok = (char *) strtok(valuetok, "\""); - - i = 0; - while ((currmaintainer->alias[i]) && (i < PACKAGER_MAXALIASES)) i++; - - while ((vartok) && (i < PACKAGER_MAXALIASES)) { - currmaintainer->alias[i]=strdup(vartok); - vartok = strtok(NULL, "\""); - vartok = strtok(NULL, "\""); - i++; - } - if (vartok) { - fprintf(stderr, - "Error: exceeding number of aliases defined for maintainer %s.",currmaintainer->name); - return 1; - } - } - } - /* check for errors and complete previous tag infos */ - for(currconfigtag = firstconfigtag; currconfigtag; - currconfigtag = currconfigtag->next) { - - if (!currconfigtag->repository_dir) { - fprintf(stderr, - "REPOSITORY_DIR not given for tag %s\n", - currconfigtag->tag); - return 1; - } - - if (!currconfigtag->repository_source_dir) { - strncpy(buf, currconfigtag->repository_dir, bufsize); - strncat(buf, "/SRPMS.base/", bufsize); - currconfigtag->repository_source_dir = - (char *) strdup(buf); - } - - currconfigtag->repository_level=0; - - for (i = 0; i < ALT_REPS_MAX; i++) { - if (currconfigtag->repository[i]) { - currconfigtag->repository_level=i+1; - } - } - currconfigtag->repository[currconfigtag->repository_level]=currconfigtag; - - if (!currconfigtag->description) - currconfigtag->description=currconfigtag->tag; - - } - - fclose(fin); - - return 0; -} - void *threadArchScan(void* arg) { int arch = *(int *)arg; diff --git a/src/functions.c b/src/functions.c index 1446e26..d88984f 100644 --- a/src/functions.c +++ b/src/functions.c @@ -69,8 +69,272 @@ # endif #endif +#include "functions.h" +#include "distromatic.h" +#include "changelog.h" + static int debug_log = 0; +struct configTag* findRepositoryByTag(const char *tag) +{ + struct configTag *ct = firstconfigtag; + + while ((ct) && (strncmp(ct->tag,tag,PATH_MAX))) ct = ct->next; + + if (ct) return ct; else return NULL; +} + +int read_configuration(const char *confFile, const char *tag) +{ + FILE *fin; + + char *vartok, *valuetok; + char input[PATH_MAX]; + char buf[PATH_MAX]; + int i, j, curraltrep = 0; + + struct configTag *newconfigtag, *currconfigtag = NULL; + struct Packager *currmaintainer; + + if ((fin = fopen(confFile, "r")) == NULL) { + return 1; + } + + unsigned int configsection = 0; + configdefaults.html_basedir = NULL; + + configdefaults.arch[0] = DEFAULT_ARCH; + for (i = 1; itag = + (char *) strndup(&vartok[1], strlen(vartok) - 2); + newconfigtag->repository_dir = NULL; + newconfigtag->repository_source_dir = NULL; + curraltrep = 0; + for (i = 0; irepository[i] = NULL; + newconfigtag->html_dir = NULL; + newconfigtag->download_prefix = NULL; + newconfigtag->download_dir = NULL; + newconfigtag->showfile_prefix = NULL; + for (i = 0; iarch[i] = configdefaults.arch[i]; + newconfigtag->headerlist[i] = NULL; + newconfigtag->filetree[i]=NULL; + for (j = 0; jprovidedlist_idx[i][j]=NULL; + } + newconfigtag->configdefaults = &configdefaults; + newconfigtag->headersourcelist = NULL; + + if (configdefaults.html_basedir) { + strncpy(buf, configdefaults.html_basedir, PATH_MAX); + strncat(buf, newconfigtag->tag, PATH_MAX); + strncat(buf, "/", PATH_MAX); + newconfigtag->html_dir = (char *) strdup(buf); + } + + if ((!tag) || (!strcmp(newconfigtag->tag, tag))) { + configtag = newconfigtag; + } + + if (!currconfigtag) { + firstconfigtag = newconfigtag; + } else { + currconfigtag->next = newconfigtag; + } + currconfigtag = newconfigtag; + } + } else if (configsection == CONF_REP_SECTION) { + /* we are reading inside a repository section... */ + if (!strcmp(vartok, "REPOSITORY_DIR")) { + currconfigtag->repository_dir = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "PARENT")) { + currconfigtag->repository[curraltrep]=findRepositoryByTag(valuetok); + if (!currconfigtag->repository[curraltrep]) { + fprintf(stderr,"Error: repository %s requested in %s was not previously configured; aborting.\n", + valuetok, currconfigtag->tag); + exit(1); + } + curraltrep++; + } else if (!strcmp(vartok, "HTML_DIR")) { + currconfigtag->html_dir = (char *) strdup(valuetok); + } else if (!strcmp(vartok, "DOWNLOAD_PREFIX")) { + currconfigtag->download_prefix = (char *) strdup(valuetok); + } else if (!strcmp(vartok, "DOWNLOAD_DIR")) { + currconfigtag->download_dir = (char *) strdup(valuetok); + } else if (!strcmp(vartok, "SHOWFILE_PREFIX")) { + currconfigtag->showfile_prefix = (char *) strdup(valuetok); + } else if (!strcmp(vartok, "REPOSITORY_SOURCE_DIR")) { + currconfigtag->repository_source_dir = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "DESCRIPTION")) { + currconfigtag->description = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "ARCHS")) { + vartok = (char *) strtok(valuetok, " "); + i = 0; + while ((vartok) && (i < ARCHS_MAX)) { + currconfigtag->arch[i] = malloc(sizeof vartok); + if (!currconfigtag->arch[i]) { + fprintf(stderr, "The system is out of memory\n"); + exit(1); + } + strcpy(currconfigtag->arch[i], vartok); + vartok = strtok(NULL, " "); + i++; + } + if (vartok) { + fprintf(stderr, + "Error: exceeding number of archs defined; maximum is %d.",ARCHS_MAX); + return 1; + } else { + currconfigtag->arch[i] = NULL; + } + } else { + fprintf(stderr, "Undefined token: %s\n", vartok); + return 1; + } + } else if (configsection == CONF_DEFAULTS_SECTION) { + /* we are in the default section */ + if (!strcmp(vartok, "HTML_BASEDIR")) { + configdefaults.html_basedir = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "DISTRIBUTION_NAME")) { + configdefaults.distribution_name = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "URL_ADDRESS")) { + configdefaults.url_address = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "URL_PREFIX")) { + configdefaults.url_prefix = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "URL_DIR")) { + configdefaults.url_dir = + (char *) strdup(valuetok); + } else if (!strcmp(vartok, "ARCHS")) { + vartok = (char *) strtok(valuetok, " "); + i = 0; + while ((vartok) && (i < ARCHS_MAX)) { + configdefaults.arch[i] = malloc(sizeof vartok); + if (!configdefaults.arch[i]) { + fprintf(stderr, "The system is out of memory\n"); + exit(1); + } + strcpy(configdefaults.arch[i], vartok); + vartok = strtok(NULL, " "); + i++; + } + if (vartok) { + fprintf(stderr, + "Error: exceeding number of archs defined; maximum is %d.",ARCHS_MAX); + return 1; + } + } else { + fprintf(stderr, + "Invalid token for `defaults' tag: %s\n", + vartok); + return 1; + } + } else if (configsection == CONF_MAINTAINERS_SECTION) { + + /* find or create maintainer */ + currmaintainer = getPackagerByName(vartok, 1); + + if (!currmaintainer) { + fprintf(stderr, + "Error: cannot create maintainers; aborting."); + return 1; + } + + currmaintainer->role |= PACKAGER_ROLE_MAINTAINER; + + vartok = (char *) strtok(valuetok, "\""); + + i = 0; + while ((currmaintainer->alias[i]) && (i < PACKAGER_MAXALIASES)) i++; + + while ((vartok) && (i < PACKAGER_MAXALIASES)) { + currmaintainer->alias[i]=strdup(vartok); + vartok = strtok(NULL, "\""); + vartok = strtok(NULL, "\""); + i++; + } + if (vartok) { + fprintf(stderr, + "Error: exceeding number of aliases defined for maintainer %s.",currmaintainer->name); + return 1; + } + } + } + /* check for errors and complete previous tag infos */ + for(currconfigtag = firstconfigtag; currconfigtag; + currconfigtag = currconfigtag->next) { + + if (!currconfigtag->repository_dir) { + fprintf(stderr, + "REPOSITORY_DIR not given for tag %s\n", + currconfigtag->tag); + return 1; + } + + if (!currconfigtag->repository_source_dir) { + strncpy(buf, currconfigtag->repository_dir, PATH_MAX); + strncat(buf, "/SRPMS.base/", PATH_MAX); + currconfigtag->repository_source_dir = + (char *) strdup(buf); + } + + currconfigtag->repository_level=0; + + for (i = 0; i < ALT_REPS_MAX; i++) { + if (currconfigtag->repository[i]) { + currconfigtag->repository_level=i+1; + } + } + currconfigtag->repository[currconfigtag->repository_level]=currconfigtag; + + if (!currconfigtag->description) + currconfigtag->description=currconfigtag->tag; + + } + + fclose(fin); + + return 0; +} + char ** dupnargv(char **argv, int count) { diff --git a/src/include/distromatic.h b/src/include/distromatic.h index 5de62e1..3f3720d 100644 --- a/src/include/distromatic.h +++ b/src/include/distromatic.h @@ -19,6 +19,7 @@ struct configDefaults { char *url_dir; char *arch[ARCHS_MAX]; }; +static struct configDefaults configdefaults; struct configTag { struct configDefaults *configdefaults; @@ -40,5 +41,6 @@ struct configTag { struct headerStats stats; struct configTag *next; }; +static struct configTag *firstconfigtag = NULL, *configtag = NULL; #endif diff --git a/src/include/functions.h b/src/include/functions.h index 0a91161..17d9abe 100644 --- a/src/include/functions.h +++ b/src/include/functions.h @@ -20,6 +20,9 @@ typedef char sizeString[SSSIZE]; #define LOG_DEBUG 4 #define LOG_MARK 8 +int read_configuration(const char *confFile, const char *tag); +struct configTag* findRepositoryByTag(const char *tag); + char **dupnargv(char **argv, int count); void *memndup(void *memp, size_t size); void log_debug_set(int value);