rpm  5.2.1
tools/rpmcmp.c
Go to the documentation of this file.
00001 #include "system.h"
00002 
00003 #include <popt.h>
00004 #include <rpmio_internal.h>
00005 #include <rpmcb.h>              /* XXX fnpyKey */
00006 #include <argv.h>
00007 #include <rpmtypes.h>
00008 #include <rpmtag.h>
00009 
00010 #define _RPMDS_INTERNAL
00011 #define _RPMEVR_INTERNAL
00012 #include <rpmds.h>
00013 
00014 #include "debug.h"
00015 
00016 const char *__progname;
00017 #define progname        __progname
00018 
00019 static int pointRpmEVR(ARGV_t av)
00020 {
00021     EVR_t a = memset(alloca(sizeof(*a)), 0, sizeof(*a));
00022     EVR_t b = memset(alloca(sizeof(*b)), 0, sizeof(*b));
00023     int rc;
00024 
00025     (void) rpmEVRparse(av[0], a);
00026     (void) rpmEVRparse(av[2], b);
00027 
00028     rc = rpmEVRcompare(a, b);
00029     if (rc < 0)
00030         rc = !(av[1][0] == 'l');
00031     else if (rc > 0)
00032         rc = !(av[1][0] == 'g');
00033     else
00034         rc = !(av[1][0] == 'e' || av[1][1] == 'e');
00035 
00036     a->str = _free(a->str);
00037     b->str = _free(b->str);
00038     return rc;
00039 }
00040 
00041 static struct poptOption optionsTable[] = {
00042  { "debug", 'd', POPT_ARG_VAL,  &_rpmevr_debug, -1,             NULL, NULL },
00043   POPT_AUTOALIAS
00044   POPT_AUTOHELP
00045   POPT_TABLEEND
00046 };
00047 
00048 int
00049 main(int argc, char *argv[])
00050 {
00051     poptContext optCon;
00052     ARGV_t av;
00053     int ac;
00054     const char * arg;
00055     int ec = 0;
00056     int rc;
00057     int xx;
00058 
00059     if ((progname = strrchr(argv[0], '/')) != NULL)
00060         progname++;
00061     else
00062         progname = argv[0];
00063 
00064     optCon = poptGetContext(argv[0], argc, (const char **)argv, optionsTable, 0);
00065     while ((rc = poptGetNextOpt(optCon)) > 0)
00066         ;
00067 
00068     av = poptGetArgs(optCon);
00069     ac = argvCount(av);
00070 
00071     if (ac == 0 || !strcmp(*av, "-")) {
00072         av = NULL;
00073         xx = argvFgets(&av, NULL);
00074         ac = argvCount(av);
00075     }
00076     
00077     if (av != NULL)
00078     while ((arg = *av++) != NULL) {
00079         ARGV_t rav = NULL;
00080         int rac = 0;
00081         if (poptParseArgvString(arg, &rac, &rav) || rac != 3) {
00082             fprintf(stderr, _("skipping malformed comparison: \"%s\"\n"), arg);
00083             continue;
00084         }
00085         rc = pointRpmEVR(rav);
00086         free(rav);
00087         rav = NULL;
00088         rac = 0;
00089     }
00090 
00091     optCon = poptFreeContext(optCon);
00092 
00093     return ec;
00094 }