parse /etc/products.d/*.prod for installed products
[platform/upstream/libsolv.git] / tools / rpmdb2solv.c
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 /*
9  * rpmdb2solv
10  * 
11  * Reads rpm database (and evtl. more, like product metadata) to build
12  * a .solv file of 'installed' solvables.
13  * 
14  */
15
16 #include <sys/types.h>
17 #include <limits.h>
18 #include <fcntl.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <unistd.h>
23
24 #include "pool.h"
25 #include "repo.h"
26 #include "repo_rpmdb.h"
27 #include "repo_products.h"
28 #include "repo_solv.h"
29 #include "common_write.h"
30
31 int
32 main(int argc, char **argv)
33 {
34   Pool *pool = pool_create();
35   Repo *repo, *ref = 0;
36   FILE *fp;
37   Pool *refpool;
38   int c;
39   int extrapool = 0;
40   const char *root = 0;
41   const char *basefile = 0;
42   const char *proddir = 0;
43
44   /*
45    * parse arguments
46    */
47   
48   while ((c = getopt (argc, argv, "xb:r:p:")) >= 0)
49     switch (c)
50       {
51       case 'r':
52         root = optarg;
53         break;
54       case 'b':
55         basefile = optarg;
56         break;
57       case 'p':
58         proddir = optarg;
59         break;
60       case 'x':
61         extrapool = 1;
62         break;
63       default:
64         exit(1);
65       }
66   
67   /*
68    * ???
69    */
70   
71   if (optind < argc)
72     {
73       if (extrapool)
74         refpool = pool_create();
75       else
76         refpool = pool;
77       if ((fp = fopen(argv[optind], "r")) == NULL)
78         {
79           perror(argv[optind]);
80           exit(1);
81         }
82       ref = repo_create(refpool, "ref");
83       repo_add_solv(ref, fp);
84       repo_disable_paging(ref);
85       fclose(fp);
86     }
87
88   /*
89    * create 'installed' repository
90    * add products
91    * add rpmdb
92    * write .solv
93    */
94
95   repo = repo_create(pool, "installed");
96
97   repo_add_rpmdb(repo, ref, root);
98
99   if (proddir)
100     {
101       repo_add_products(repo, proddir);
102     }
103   if (ref)
104     {
105       if (ref->pool != pool)
106         pool_free(ref->pool);
107       else
108         repo_free(ref, 1);
109       ref = 0;
110     }
111
112   tool_write(repo, basefile, 0);
113   pool_free(pool);
114
115   exit(0);
116 }