00001
00006 #include "system.h"
00007
00008 #include "rpmbuild.h"
00009 #include "debug.h"
00010
00011
00012
00013
00014
00015
00016 static const char *name = NULL;
00017
00018 static const char *file = NULL;
00019
00020 static struct poptOption optionsTable[] = {
00021 { NULL, 'n', POPT_ARG_STRING, &name, 'n', NULL, NULL},
00022 { NULL, 'f', POPT_ARG_STRING, &file, 'f', NULL, NULL},
00023 { 0, 0, 0, 0, 0, NULL, NULL}
00024 };
00025
00026 int parseFiles(Spec spec)
00027 {
00028 int nextPart;
00029 Package pkg;
00030 int rc, argc;
00031 int arg;
00032 const char ** argv = NULL;
00033 int flag = PART_SUBNAME;
00034 poptContext optCon = NULL;
00035
00036
00037 name = NULL;
00038 file = NULL;
00039
00040
00041 if ((rc = poptParseArgvString(spec->line, &argc, &argv))) {
00042 rpmError(RPMERR_BADSPEC, _("line %d: Error parsing %%files: %s\n"),
00043 spec->lineNum, poptStrerror(rc));
00044 rc = RPMERR_BADSPEC;
00045 goto exit;
00046 }
00047
00048 optCon = poptGetContext(NULL, argc, argv, optionsTable, 0);
00049 while ((arg = poptGetNextOpt(optCon)) > 0) {
00050 if (arg == 'n') {
00051 flag = PART_NAME;
00052 }
00053 }
00054
00055 if (arg < -1) {
00056 rpmError(RPMERR_BADSPEC, _("line %d: Bad option %s: %s\n"),
00057 spec->lineNum,
00058 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
00059 spec->line);
00060 rc = RPMERR_BADSPEC;
00061 goto exit;
00062 }
00063
00064 if (poptPeekArg(optCon)) {
00065
00066 if (name == NULL)
00067 name = poptGetArg(optCon);
00068
00069 if (poptPeekArg(optCon)) {
00070 rpmError(RPMERR_BADSPEC, _("line %d: Too many names: %s\n"),
00071 spec->lineNum,
00072 spec->line);
00073 rc = RPMERR_BADSPEC;
00074 goto exit;
00075 }
00076 }
00077
00078 if (lookupPackage(spec, name, flag, &pkg)) {
00079 rpmError(RPMERR_BADSPEC, _("line %d: Package does not exist: %s\n"),
00080 spec->lineNum, spec->line);
00081 rc = RPMERR_BADSPEC;
00082 goto exit;
00083 }
00084
00085 if (pkg->fileList != NULL) {
00086 rpmError(RPMERR_BADSPEC, _("line %d: Second %%files list\n"),
00087 spec->lineNum);
00088 rc = RPMERR_BADSPEC;
00089 goto exit;
00090 }
00091
00092 if (file) {
00093
00094 pkg->fileFile = rpmGetPath(file, NULL);
00095 }
00096
00097 pkg->fileList = newStringBuf();
00098
00099 if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
00100 nextPart = PART_NONE;
00101 } else {
00102 if (rc)
00103 goto exit;
00104 while (! (nextPart = isPart(spec->line))) {
00105 appendStringBuf(pkg->fileList, spec->line);
00106 if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
00107 nextPart = PART_NONE;
00108 break;
00109 }
00110 if (rc)
00111 goto exit;
00112 }
00113 }
00114 rc = nextPart;
00115
00116 exit:
00117 argv = _free(argv);
00118 optCon = poptFreeContext(optCon);
00119
00120 return rc;
00121 }