1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/*
* dpkg - main program for package management
* update.c - options which update the `available' database
*
* Copyright (C) 1995 Ian Jackson <ian@chiark.greenend.org.uk>
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2,
* or (at your option) any later version.
*
* This is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with dpkg; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <config.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fnmatch.h>
#include <assert.h>
#include <unistd.h>
#include <dpkg.h>
#include <dpkg-db.h>
#include <myopt.h>
#include "main.h"
void updateavailable(const char *const *argv) {
const char *sourcefile= argv[0];
int count= 0;
static struct varbuf vb;
switch (cipaction->arg) {
case act_avclear:
if (sourcefile) badusage(_("--%s takes no arguments"),cipaction->olong);
break;
case act_avreplace: case act_avmerge:
if (!sourcefile || argv[1])
badusage(_("--%s needs exactly one Packages file argument"),cipaction->olong);
break;
default:
internerr("bad cipaction->arg in updateavailable");
}
if (!f_noact) {
if (access(admindir,W_OK)) {
if (errno != EACCES)
ohshite(_("unable to access dpkg status area for bulk available update"));
else
ohshit(_("bulk available update requires write access to dpkg status area"));
}
lockdatabase(admindir);
}
switch (cipaction->arg) {
case act_avreplace:
printf(_("Replacing available packages info, using %s.\n"),sourcefile);
break;
case act_avmerge:
printf(_("Updating available packages info, using %s.\n"),sourcefile);
break;
case act_avclear:
break;
default:
internerr("bad cipaction->arg in update available");
}
varbufaddstr(&vb,admindir);
varbufaddstr(&vb,"/" AVAILFILE);
varbufaddc(&vb,0);
if (cipaction->arg == act_avmerge)
parsedb(vb.buf, pdb_recordavailable|pdb_rejectstatus, 0,0,0);
if (cipaction->arg != act_avclear)
count+= parsedb(sourcefile, pdb_recordavailable|pdb_rejectstatus, 0,0,0);
if (!f_noact) {
writedb(vb.buf,1,0);
unlockdatabase(admindir);
}
if (cipaction->arg != act_avclear)
printf(_("Information about %d package(s) was updated.\n"),count);
}
void forgetold(const char *const *argv) {
struct pkgiterator *it;
struct pkginfo *pkg;
enum pkgwant oldwant;
if (*argv) badusage(_("--forget-old-unavail takes no arguments"));
modstatdb_init(admindir, f_noact ? msdbrw_readonly : msdbrw_write);
it= iterpkgstart();
while ((pkg= iterpkgnext(it))) {
debug(dbg_eachfile,"forgetold checking %s",pkg->name);
if (informative(pkg,&pkg->available)) {
debug(dbg_eachfile,"forgetold ... informative available");
continue;
}
if (pkg->want != want_purge && pkg->want != want_deinstall) {
debug(dbg_eachfile,"forgetold ... informative want");
continue;
}
oldwant= pkg->want;
pkg->want= want_unknown;
if (informative(pkg,&pkg->installed)) {
debug(dbg_eachfile,"forgetold ... informative installed");
pkg->want= oldwant;
continue;
}
debug(dbg_general,"forgetold forgetting %s",pkg->name);
}
iterpkgend(it);
modstatdb_shutdown();
}
|