rpm 5.3.12
|
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 }