rpm 5.3.12
build/parseFiles.c
Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 
00008 #include <rpmio.h>
00009 #include <rpmiotypes.h>
00010 #include <rpmlog.h>
00011 #include "rpmbuild.h"
00012 #include "debug.h"
00013 
00014 /*@access poptContext @*/       /* compared with NULL */
00015 
00016 /* These have to be global scope to make up for *stupid* compilers */
00017 /*@unchecked@*/
00018     /*@observer@*/ /*@null@*/ static const char *name = NULL;
00019 /*@unchecked@*/
00020     /*@observer@*/ /*@null@*/ static const char *file = NULL;
00021 /*@unchecked@*/
00022     static struct poptOption optionsTable[] = {
00023         { NULL, 'n', POPT_ARG_STRING, &name, 'n',       NULL, NULL},
00024         { NULL, 'f', POPT_ARG_STRING, &file, 'f',       NULL, NULL},
00025         { 0, 0, 0, 0, 0,        NULL, NULL}
00026     };
00027 
00028 int parseFiles(Spec spec)
00029 {
00030     rpmParseState nextPart;
00031     Package pkg;
00032     int rc, argc;
00033     int arg;
00034     const char ** argv = NULL;
00035     int flag = PART_SUBNAME;
00036     poptContext optCon = NULL;
00037 
00038     /*@-mods@*/
00039     name = NULL;
00040     file = NULL;
00041     /*@=mods@*/
00042 
00043     if ((rc = poptParseArgvString(spec->line, &argc, &argv))) {
00044         rpmlog(RPMLOG_ERR, _("line %d: Error parsing %%files: %s\n"),
00045                  spec->lineNum, poptStrerror(rc));
00046         rc = RPMRC_FAIL;
00047         goto exit;
00048     }
00049 
00050     optCon = poptGetContext(NULL, argc, argv, optionsTable, 0);
00051     while ((arg = poptGetNextOpt(optCon)) > 0) {
00052         if (arg == 'n') {
00053             flag = PART_NAME;
00054         }
00055     }
00056 
00057     if (arg < -1) {
00058         rpmlog(RPMLOG_ERR, _("line %d: Bad option %s: %s\n"),
00059                  spec->lineNum,
00060                  poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
00061                  spec->line);
00062         rc = RPMRC_FAIL;
00063         goto exit;
00064     }
00065 
00066     if (poptPeekArg(optCon)) {
00067         /*@-mods@*/
00068         if (name == NULL)
00069             name = poptGetArg(optCon);
00070         /*@=mods@*/
00071         if (poptPeekArg(optCon)) {
00072             rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
00073                      spec->lineNum,
00074                      spec->line);
00075             rc = RPMRC_FAIL;
00076             goto exit;
00077         }
00078     }
00079 
00080     if (lookupPackage(spec, name, flag, &pkg) != RPMRC_OK) {
00081         rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
00082                  spec->lineNum, spec->line);
00083         rc = RPMRC_FAIL;
00084         goto exit;
00085     }
00086 
00087     if (pkg->fileList != NULL) {
00088         rpmlog(RPMLOG_ERR, _("line %d: Second %%files list\n"),
00089                  spec->lineNum);
00090         rc = RPMRC_FAIL;
00091         goto exit;
00092     }
00093 
00094     if (file)  {
00095     /* XXX not necessary as readline has expanded already, but won't hurt.  */
00096         pkg->fileFile = rpmGetPath(file, NULL);
00097     }
00098 
00099     pkg->fileList = rpmiobNew(0);
00100     
00101     if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
00102         nextPart = PART_NONE;
00103     } else {
00104         if (rc)
00105             goto exit;
00106         while ((nextPart = isPart(spec)) == PART_NONE) {
00107             pkg->fileList = rpmiobAppend(pkg->fileList, spec->line, 0);
00108             if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
00109                 nextPart = PART_NONE;
00110                 break;
00111             }
00112             if (rc)
00113                 goto exit;
00114         }
00115     }
00116 
00117 #if defined(RPM_VENDOR_MANDRIVA)
00118     /* if no %clean section, add implicit */
00119     rc = (nextPart == PART_NONE && spec->clean == NULL) ? PART_CLEAN : nextPart;
00120 #else
00121     rc = nextPart;
00122 #endif
00123 
00124 exit:
00125     argv = _free(argv);
00126     optCon = poptFreeContext(optCon);
00127         
00128     return rc;
00129 }