]> cygwin.com Git - cygwin-apps/setup.git/blame - package_db.cc
(IniDBBuilderPackage::process_src): Streamline and split out
[cygwin-apps/setup.git] / package_db.cc
CommitLineData
7939f6d1
RC
1/*
2 * Copyright (c) 2001, Robert Collins.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by Robert Collins <rbtcollins@hotmail.com>
13 *
14 */
15
16/* this is the package database class.
17 * It lists all known packages, including custom ones, ones from a mirror and
18 * installed ones.
19 */
20
21#if 0
22static const char *cvsid =
23 "\n%%% $Id$\n";
24#endif
7939f6d1
RC
25#include <stdio.h>
26#include <stdlib.h>
27#include <unistd.h>
28#include <strings.h>
45e01f23
RC
29#if HAVE_ERRNO_H
30#include <errno.h>
31#endif
7939f6d1
RC
32
33#include "io_stream.h"
34#include "compress.h"
35
36#include "filemanip.h"
37
fa0c0d10 38#include "package_version.h"
7939f6d1
RC
39#include "cygpackage.h"
40#include "package_db.h"
41#include "package_meta.h"
42
43/* static members */
44
7939f6d1
RC
45packagedb::packagedb ()
46{
df62e023 47 io_stream *db = 0;
7939f6d1
RC
48 if (!installeddbread)
49 {
50 /* no parameters. Read in the local installation database. */
51 db = io_stream::open ("cygfile:///etc/setup/installed.db", "rt");
52 if (!db)
53 return;
54 /* flush_local_db_package_data */
55 char line[1000], pkgname[1000], inst[1000], src[1000];
56 int instsz, srcsz;
7939f6d1 57
24cbae7f
RC
58 if (db->gets (line, 1000))
59 {
60 int dbver;
61 sscanf (line, "%s %d", pkgname, &instsz);
62 if (!strcasecmp (pkgname, "INSTALLED.DB") && instsz == 2)
63 dbver = 2;
64 else
65 dbver = 1;
66 delete db;
fa0c0d10 67 db = 0;
24cbae7f
RC
68 /* Later versions may not use installed.db other than to record the version. */
69 if (dbver == 1 || dbver == 2)
7939f6d1 70 {
24cbae7f
RC
71 db =
72 io_stream::open ("cygfile:///etc/setup/installed.db", "rt");
73 if (dbver == 2)
74 db->gets (line, 1000);
75 while (db->gets (line, 1000))
7939f6d1 76 {
24cbae7f
RC
77 int parseable;
78 src[0] = 0;
79 srcsz = 0;
80 sscanf (line, "%s %s %d %s %d", pkgname, inst, &instsz, src,
81 &srcsz);
82 fileparse f;
83 parseable = parse_filename (inst, f);
84 if (!parseable)
85 continue;
86
cbfc4215 87 packagemeta *pkg = packages.getbykey (pkgname);
24cbae7f
RC
88 if (!pkg)
89 {
fa0c0d10 90 pkg = new packagemeta (pkgname, inst);
24cbae7f
RC
91 /* we should install a new handler then not check this...
92 */
93 //if (!pkg)
94 //die badly
95 }
96
97 cygpackage *binary =
98 new cygpackage (pkgname, inst, instsz, f.ver,
99 package_installed,
100 package_binary);
101
102 pkg->add_version (*binary);
103 pkg->set_installed (*binary);
bb849dbd 104 pkg->desired = pkg->installed;
cbfc4215 105 packages.registerbyobject (*pkg);
7939f6d1 106
7939f6d1 107 }
24cbae7f 108 delete db;
fa0c0d10 109 db = 0;
24cbae7f
RC
110 }
111 else
112 // unknown dbversion
113 exit (1);
7939f6d1 114 }
7b606ae5 115 installeddbread = 1;
7939f6d1 116 }
7939f6d1
RC
117}
118
7c7034e8
RC
119int
120packagedb::flush ()
121{
122 /* naive approach - just dump the lot */
123 char const *odbn = "cygfile:///etc/setup/installed.db";
124 char const *ndbn = "cygfile:///etc/setup/installed.db.new";
125
126 io_stream::mkpath_p (PATH_TO_FILE, ndbn);
127
128 io_stream *ndb = io_stream::open (ndbn, "wb");
129
3c054baf 130 // XXX if this failed, try removing any existing .new database?
7c7034e8
RC
131 if (!ndb)
132 return errno ? errno : 1;
133
134 ndb->write ("INSTALLED.DB 2\n", strlen ("INSTALLED.DB 2\n"));
4f4e55c2 135 for (size_t n = 1; n <= packages.number (); n++)
7c7034e8 136 {
df62e023
RC
137 packagemeta & pkgm = *packages[n];
138 if (pkgm.installed)
139 {
140 char line[2048];
141
142 /* size here is irrelevant - as we can assume that this install source
143 * no longer exists, and it does not correlate to used disk space
144 * also note that we are writing a fictional install source
145 * to keep cygcheck happy.
146 */
3c054baf 147 sprintf (line, "%s %s %d\n", pkgm.name.cstr_oneuse(),
1ac649ed
RC
148 (pkgm.name + "-" + pkgm.installed->Canonical_version () +
149 ".tar.bz2").cstr_oneuse(), 0);
df62e023
RC
150 ndb->write (line, strlen (line));
151 }
7c7034e8
RC
152 }
153
154 delete ndb;
155
156 io_stream::remove (odbn);
157
158 if (io_stream::move (ndbn, odbn))
159 return errno ? errno : 1;
160 return 0;
161}
162
df62e023
RC
163int
164 packagedb::installeddbread =
165 0;
3c054baf
RC
166list < packagemeta, String,
167 String::casecompare >
df62e023 168 packagedb::packages;
3c054baf
RC
169list < Category, String,
170 String::casecompare >
4fe323f9 171 packagedb::categories;
df62e023
RC
172PackageDBActions
173 packagedb::task =
174 PackageDB_Install;
This page took 0.045611 seconds and 5 git commands to generate.